Laden...

Thread Probleme mit Variablen

Erstellt von Wurschtl vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.242 Views
W
Wurschtl Themenstarter:in
3 Beiträge seit 2009
vor 15 Jahren
Thread Probleme mit Variablen

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();
}

308 Beiträge seit 2005
vor 15 Jahren

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...

W
Wurschtl Themenstarter:in
3 Beiträge seit 2009
vor 15 Jahren

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.

49.485 Beiträge seit 2005
vor 15 Jahren

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

W
Wurschtl Themenstarter:in
3 Beiträge seit 2009
vor 15 Jahren

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?

Gelöschter Account
vor 15 Jahren

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.