allo, bin noch etwas neu in dieser Materie und hoffe auf eure Hilfe.
Programmiere gerade ein kleines Program was 2 separate Threads enthält.
Einer für die Kommunikation und ein zweiter für die allgemeine Abarbeitung.
Ich kann beide Threads starten und sauber beenden.
Im Thread für die Kommunikation wird eine Variable abgefragt. Wenn Sie "true" ist, soll er einfach einen String senden und die Variable wieder auf "false" setzen.
Der zweite Thread soll nach ablauf einer Zeit die diese auf "true" setzen und den Kommunikationsthread veranllasen zu senden.
Leider funktioniert das nicht so wie es soll. Was mach ich falsch?
Das Problem ist, das "SerialTransmitRequest" aufgerufen wird, der Status der boolschen VAriable auf true gesetzt wird (im Debuggmode sieht man auch die Variable auf true), wenn jedoch der Thread an der Abfrage ist, wird immer false gelesen. Es ist fast so als ob die Variable niem
Beide Thread laufen in Ihren unterschiedlichen Klassen, können jedoch sich irgendwie nicht gegenseitig beeinflussen.
Bei einem Test habe ich über ein ButtonClickEvent die Funtion "SerialTransmitRequest" genauso aufgerufen. Damit hatte es Funktioniert.
Hoffe Ihr könnt mir helfen.
Hier der Code:
"Der Timerthread"
protected void TimerLoop()
{
while( !_TimerStopRequest )
{
if(main_serial_rx_tx_thd != null)
{
lock(lockvar)
{
main_serial_rx_tx_thd.SerialTransmitRequest = true;
}
}
Thread.Sleep(500);
}
}
"Funktion zur Veränderung der Variable"
public bool SerialTransmitRequest
{
set { _Start_Serial_Transfer = value; }
}
"Kommunikationsthread"
protected void SerialLoop()
{
while( !_SerialStopRequest )
{
lock(lockvar)
{
if(_Start_Serial_Transfer)
{
serialPort1.Write("Hallo\r");
_Start_Serial_Transfer = false;
}
Thread.Sleep(0);
}
}
serialPort1.Close();
}
Hallo Wurschtl,
ohne mir deinen Code im Detail angeschaut zu haben würde ich dir empfehlen mal über die Benutzung Events nachzudenken. Hier im besonderen das AutoResetEvent. Dann brauchst Du auch keinen Loop mehr, sondern kannst einfach auf das Event warten...
Hallo cadi,
erstmal danke für deine Antwort.
Wie funktioniert das denn genau mit dem AutoresetEvent?
Hättest Du ein kleines Beispiel für mich wie ich das implementieren könnte.
Ich bin wie gesagt noch sehr neu.
Wäre super wenn Du mir helfen könntest.
Hallo Wurschtl,
wie cadi schon gesagt hat, sind Polling-Schleifen möglichst zu vermeiden.
Beispiele findest du fast immer in der :rtfm: Doku. Also bitte immer (erst) dort schauen und nicht hier danach fragen.
Hier noch ein Beitrag, der das Prinzip zeigt: Consolenanwendung mit Timer optimieren [Semaphore/Ampel]
Was dein Variablenproblem angeht, würde ich vermuten, dass du beim Setzen und beim Abfragen auf unterschiedliche Instanzen zugreifst.
herbivore
Hallo Herbivore,
danke für deine Antwort.
Werde es in Zukunft beherzigen und erstmal in den Doku nachsehen.
Eine Frage habe ich jedoch noch. Du hast geschrieben: "Was dein Variablenproblem angeht, würde ich vermuten, dass du beim Setzen und beim Abfragen auf unterschiedliche Instanzen zugreifst."
Wie kann ich das ändern, das ich nicht mehr auf unterschiedliche Instanzen zugreife?
Wie kann ich das ändern, das ich nicht mehr auf unterschiedliche Instanzen zugreife?
sry aber das fällt unter
Wichtig: [Hinweis] Wie poste ich richtig?
Punkt 1.1.1
außerdem kann man das nicht absolut pauschal sagen. das musst du in deinem code erkennen.