Frage

Mein Problem: Ich habe für Serialport DataReceived Veranstaltung, die an den seriellen Port lauscht und fügt alles zu RichTextBox. Nun möchte Ich mag RichTextBox Inhalt in txt-Datei zu speichern. Ich kann dies tun:

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

Aber ich fürchte, (und bitte korrigieren Sie mich, wenn ich falsch bin), dass nur zwischen meinen beiden Aktionen (Inhalt der Variablen speichern, klare RichTextBox) ein weiterer Eingang könnte Serialport kommen. Weil ich es nicht meine Variable gespeichert hat und ich klar RichTextBox sofort darauf diese neuen Daten gelöscht werden konnte, ohne mich überhaupt zu wissen, dass es je gegeben hat.

Könnte dies wirklich geschehen und wie kann ich es vermeiden?

Danke

War es hilfreich?

Lösung

Sie haben Ihre Eingaben von dem seriell Port irgendwie zu synchronisieren. Ich nehme an, Sie verwenden Invoke im DataReceived Ereignis. So Änderungen an den Inhalt der RichTextBox werden von dem Haupt-Thread getan, und Sie sollten sicher sein.

Aber wie der Strom von der seriellen Schnittstelle unwahrscheinlich ist, RTF zu sein (würden Sie andere Probleme haben, wenn es ist), man könnte genauso gut einen Text (MultLine = true) verwenden.

Andere Tipps

Dies könnte passieren, wenn Sie mehrere Threads verwenden. In einer einzigen Thread-Anwendung, würde dieses Problem nicht auf.

Um dies zu verhindern, können Sie Mutex verwenden. Dies ist, wie es funktioniert: Der Code-Schnipsel, die auf dem Inhalt der RichTextBox funktionieren soll nicht gleichzeitig ausgeführt werden. Diese Code-Schnipsel werden kritische Abschnitte bezeichnet. Wenn Sie einen kritischen Abschnitt eingeben, sperren Sie den Mutex und es freigeben, wenn der kritischen Abschnitt verlassen. Wenn ein Mutex gesperrt ist, wenn Sie versuchen, einen kritischen Abschnitt einzugeben, warten Sie, bis das Mutex freigegeben wird, und dann Ihren Job zu tun.

Auf diese Weise, wenn eine Eingabe über die serielle Schnittstelle kommt, während in die Datei zu schreiben, wird der Thread die Daten empfangend, bis die Datei wartet I / O fertig ist und es dann an die RichTextBox hängen.

Sie können dies erreichen, indem die sperren Anweisung in c #.

Weiterführende Literatur: Mutex , Critical Section

das könnte durchaus passieren (und wahrscheinlich würde).

Es sei denn es andere Überlegungen sind, glaube ich, dass Sie besser wäre es, die Daten aus dem Serialport-Stream bedient mit der Textdatei direkt zu schreiben, anstatt in die Datei zu schreiben, die RichTextBox.Text verwenden. Die DataReceived Event-Handler wie folgt aussehen sollte ...

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top