2009-09-15 16 views
0

Mon problème: J'ai l'événement DataReceived pour SerialPort, qui écoute le port série et ajoute tout à RichTextBox. Maintenant, je voudrais enregistrer le contenu de RichTextBox dans le fichier txt. Je pouvais le faire:Supprimer le texte de RichTextBox

string text = RichTextBox.Text; 
// save file 
RichTextBox.Clear(); 

Mais je crains (et s'il vous plaît me corriger si je me trompe), que juste entre mes deux actions (enregistrer le contenu à la variable, RichTextBox claire) une autre entrée pourrait venir à SerialPort. Comme je ne l'ai pas enregistré dans ma variable et que j'ai effacé RichTextBox juste après, cette nouvelle donnée a pu être supprimée, sans même que je sache qu'elle ait jamais existé.

Est-ce que cela pourrait vraiment arriver et comment puis-je l'éviter?

Merci

Répondre

2

Vous devez synchroniser vos entrées du port série en quelque sorte. Je suppose que vous utilisez Invoke dans l'événement DataReceived. Ainsi, toute modification apportée au contenu de la zone RichTextBox est effectuée par le thread principal et vous devriez être en sécurité. Mais comme le flux du port série est peu susceptible d'être RTF (vous auriez d'autres problèmes si c'était le cas), vous pouvez aussi bien utiliser un TextBox (MultLine = true). Absolument que cela pourrait arriver (et le ferait probablement).

+0

J'écris dans RichTextBox avec Invoke (à partir du thread DataReceived), l'écriture et la lecture se font donc dans le même thread (GUI). Cela signifie que mon scénario ne pourrait pas se produire? – sventevit

+0

À première vue, je ne pensais pas que l'utilisation d'Invoke vous protégerait, mais maintenant que j'ai réfléchi à cela, cela vous protégerait. Bonne réponse! +1 – David

+0

J'utilise RichTextBox car je vérifie chaque entrée du port série dans SQL et récupère son statut. Si le statut est 'OK', la couleur du texte pour cette entrée est verte, sinon OK, la couleur du texte est rouge. L'opérateur peut facilement voir si l'entrée est OK ou non OK ... – sventevit

0

Cela peut arriver si vous utilisez plusieurs threads. Dans une application de thread unique, ce problème ne se produirait pas.

Pour éviter cela, vous pouvez utiliser le mutex. Voici comment cela fonctionne: Les extraits de code qui fonctionnent sur le contenu de RichTextBox ne doivent pas être exécutés simultanément. Ces extraits de code sont appelés sections critiques. Lorsque vous entrez dans une section critique, vous verrouillez le mutex et le relâchez lorsque vous quittez la section critique. Si un mutex est verrouillé lorsque vous essayez d'entrer dans une section critique, attendez que ce mutex soit libéré, puis faites votre travail. De cette façon, si une entrée passe par le port série lors de l'écriture dans le fichier, le thread recevant les données attendra jusqu'à ce que l'E/S du fichier soit terminée, puis l'ajouter à RichTextBox.

Vous pouvez y parvenir en utilisant l'instruction lock dans C#.

Pour en savoir plus: Mutex, Critical Section

+0

La synchronisation de bricolage ne fonctionnera pas, les contrôles vérifient ThreadId et lancent. Vous devez utiliser Invoke(). –

0

À moins d'autres considérations, je crois que vous seriez mieux servi en utilisant les données du flux SerialPort pour écrire le fichier texte directement, plutôt que d'écrire dans le fichier en utilisant RichTextBox.Text. Le gestionnaire d'événements DataReceived doit ressembler à ceci:

private void SerialPort1.DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    string DataText = // code to read the serialport data and convert 
    //it into a string, which you already have so I 
    //won't repeat it here. 

    WriteToTextBox(DataText); 
    WriteToFile(DataText); 
} 
+0

Dans l'événement DataReceived, j'écris d'abord du texte dans la base de données SQL, puis je l'affiche dans RichTextBox pour que l'opérateur puisse voir à l'écran ce qui a été analysé.L'enregistrement dans un fichier texte n'est qu'une autre option pour l'opérateur (si quelque chose ne va pas, il peut simplement sauvegarder le texte dans un fichier et l'envoyer à l'administrateur). – sventevit