Question

Mon problème: j'ai un événement DataReceived pour SerialPort, qui écoute le port série et ajoute tout à RichTextBox. Maintenant, j'aimerais enregistrer le contenu de RichTextBox dans un fichier txt. Je pourrais faire ceci:

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

Mais je crains (et corrigez-moi si je me trompe) que juste entre mes deux actions (enregistrer le contenu dans une variable, effacer RichTextBox), une autre entrée puisse arriver à SerialPort. Parce que je ne l'ai pas sauvegardée dans ma variable et que j'efface RichTextBox juste après, les nouvelles données peuvent être supprimées sans même que je sache qu'elles ont existé.

Cela pourrait-il vraiment arriver et comment puis-je l'éviter?

Merci

Était-ce utile?

La solution

Vous devez d'une manière ou d'une autre synchroniser vos entrées à partir du port série. Je suppose que vous utilisez Invoke dans l'événement DataReceived. Ainsi, toute modification du contenu de RichTextBox est effectuée par le thread principal et vous devez être en sécurité.

Mais comme il est peu probable que le flux du port série soit du format RTF (vous auriez d’autres problèmes, le cas échéant), vous pouvez également utiliser une zone de texte (MultLine = true).

Autres conseils

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

Pour éviter cela, vous pouvez utiliser 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 relâchez-le lorsque vous quittez la section critique. Si un mutex est verrouillé lorsque vous essayez d'entrer dans une section critique, attendez qu'il soit libéré, puis faites votre travail.

Ainsi, si une entrée passe par le port série lors de l'écriture dans le fichier, le thread qui reçoit les données attendra que l'opération d'E / S du fichier soit terminée, puis l'ajoutera à RichTextBox.

Vous pouvez y parvenir en utilisant le verrouiller

Lectures supplémentaires: Mutex , Section critique

Absolument, cela pourrait arriver (et le serait probablement).

Sauf autres considérations, je pense qu’il serait préférable d’utiliser les données du flux SerialPort pour écrire le fichier texte directement, plutôt que d’écrire dans le fichier à l’aide de RichTextBox.Text. Le gestionnaire d’événements DataReceived devrait ressembler à quelque chose comme ça ...

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top