LabVIEWForum.de
"Race-Conditions"?! vermeiden/beheben - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: "Race-Conditions"?! vermeiden/beheben (/Thread-Race-Conditions-vermeiden-beheben)

Seiten: 1 2


"Race-Conditions"?! vermeiden/beheben - TSC - 24.04.2009 08:43

Moin zusammen,

ich habe zwei VIs:

1. In einem Event-Case wird auf Knopfdruck eine Umgebungsvariable gesetzt (auf den Wert des Buttons). Nach dem Setzen wird eine Meldung gesendet.

2. Es wird auf eine Meldung gewartet. Sobald sie eintrifft, wird der Wert der Umgebungsvariable angezeigt.

Starte ich die VIs so zeigt mir das zweite VI grundsätzlich den falschen Wert an (also den Wert vor dem Buttonklick). Starte ich dagegen mit eingeschalteter Highlightfunktion, so funktioniert alles so wie es soll. Ich habe auch schon eine Wartezeit von einer Sekunde nach der "Auf Meldung warten"-Funktion eingebaut, dann läuft es korrekt.

Ist es also tatsächlich so, dass eine Umgebungsvariable soo langsam geschrieben wird, dass in der Zeit eine Meldung vertschickt und empfangen werden kann und was ich noch erstaunlicher finde, dass der Wert der Umgebungsvariable ausgelesen werden kann, obwohl ein andere Prozess grade den neuen Wert schreiben sollte???

LG
Torsten


"Race-Conditions"?! vermeiden/beheben - Y-P - 24.04.2009 08:55

Hast Du 2 Netzwerkkarten in Deinem Rechner? Wenn ja, dann deaktiviere mal eine davon.
Wenn nein, dann schraub' die Wartezeit mal auf z.B. 50 ms zurück. Geht's dann auch noch?

Gruß Markus


"Race-Conditions"?! vermeiden/beheben - TSC - 24.04.2009 08:57

Habe nur eine Netzwerkkarte!

Mit 50 ms läuft es fehlerfrei!


"Race-Conditions"?! vermeiden/beheben - TSC - 24.04.2009 09:22

Aber mir wäre es lieber wenn man da keine pause machen müsste. also wer garantiert mir denn, dass 50 ms ausreichen und nciht irgendwie mal noch andere prozesse die cpu brauchen und sich die wartezeit erhöhen müsste?


"Race-Conditions"?! vermeiden/beheben - Y-P - 24.04.2009 10:34

Kannst Du Dein Projekt (oder ein kleines Bsp.-Projekt, wo man sieht, was Du genau machst) hochladen?

Gruß Markus


"Race-Conditions"?! vermeiden/beheben - IchSelbst - 24.04.2009 10:37

' schrieb:1. In einem Event-Case wird auf Knopfdruck eine Umgebungsvariable gesetzt (auf den Wert des Buttons). Nach dem Setzen wird eine Meldung gesendet.
2. Es wird auf eine Meldung gewartet. Sobald sie eintrifft, wird der Wert der Umgebungsvariable angezeigt.
In diesem Falle würde ich in der Meldung den Wert des Buttons mit schicken.


"Race-Conditions"?! vermeiden/beheben - TSC - 24.04.2009 10:47

Das klingt nach einer guten lösung!

Vielen Dank. Rein fürs Interesse erstelle ich gleich mal ein kleines Beispielprojekt. nach der Mittagspause!


"Race-Conditions"?! vermeiden/beheben - TSC - 24.04.2009 12:27

So, ich hab mal auf das wesentliche reduziert so dass der effekt erkennbar ist. Zuerst das Consumer.VI starten, dann das Main.vi.

Problem bei der vorhin vorgeschlagenen Lösung ist: ich möchte melden, wenn eine von vielen Variablen den wert ändert. in der anzeige sollen dann einfach alle variablen neu ausgelesen werden. mit dem vorschlag einfach den wert des buttons in die meldung zu integrieren komme ich daher nicht weiter, ich müsste dann ja noch zuordnen, welcher button aktualisiert wurde.

gezipptes projekt:
Lv86_img[attachment=17997]


"Race-Conditions"?! vermeiden/beheben - IchSelbst - 24.04.2009 13:12

' schrieb:Problem bei der vorhin vorgeschlagenen Lösung ist: ich möchte melden, wenn eine von vielen Variablen den wert ändert. in der anzeige sollen dann einfach alle variablen neu ausgelesen werden. mit dem vorschlag einfach den wert des buttons in die meldung zu integrieren komme ich daher nicht weiter, ich müsste dann ja noch zuordnen, welcher button aktualisiert wurde.
Ich habe kein Problem damit, alle Buttons per Melder zu verschicken.


"Race-Conditions"?! vermeiden/beheben - IchSelbst - 24.04.2009 13:59

' schrieb:also wer garantiert mir denn, dass 50 ms ausreichen und nciht irgendwie mal noch andere prozesse die cpu brauchen und sich die wartezeit erhöhen müsste?
Du verwendet hier für Status und Daten zwei verschiedene Wege. Beide Wege sind zu einander asynchron. Aber beide Wege haben eine Beziehung. Asynchron und Beziehung beißt sich: eine Beziehung muss immer synschon sein (asynchron => RaceCondition).