Thread Pausieren, Stoppen oder laufen lassen?
-
Mit dem Pausieren meine ich, dass ich den Thread Anhalte (nicht beende) und meine Manuellen Änderungen durchführe. Danach wollte ich den Thread fortsetzen. Ist meiner Meinung nach Sauberer als wen ich da was Hinwurschtel und es nur auf gut Glück läuft.
ReadAxes() liest mir Register aus einem UMB-Gerät aus. Das dauert ein kurzen moment und der Sleep(50) ist halt genau dafür drin. Habs ohne Versucht (oder mit <50) aber da bekam ich öffter fehlerhafte Reports (und ich bin froh, dass es soweit geht)
Wie lasse ich denn einen WorkerThread wieder anlaufen (nur nen Stichwort für Google
)P.S.
Ist die Threadfunktion eigentlich soweit IO ?
-
Ob das in Ordnung ist kann ich nicht beurteilen. Wundern tut mich einfach, dass es hier eine endlos Schleife gibt.
Warten kannst Du doch ganz einfach in dem Du ein Event z.B. zurück setzt und der Thread immer auf deises Event warten muss.
Hüte Dich vor SuspendThread! Das ist genauso tabu wie TerminateThread...
-
Das mit der Endlosschleife versteh ich nicht ganz.
Der Thread startet bei beginn meines Programms und Endet wenn ich es Schließe (OnClose-> tBool auf TUE setzen) oder den Thread mit AfxEndThread() Beende (Starten tu ich den mit AfxBeginThread()).Ich hab die Basis des Threads aus einem Forumsbeitrag so übernommen und den Mutex Hinzugefügt.
Wie sollte ein Thread denn sonst (im Prinzip) aussehen?
-
Jetzt erzähle mir bitte, dass dies keine Endlosschleifeist:
while(pThis->thread->tBool == FALSE) { /*Versuch das ganze als Leerlauf laufen zu lassen*/ // if(pThis->thread->cBool == TRUE) // { if(pThis->thread->DevHandle[1] != INVALID_HANDLE_VALUE) { pThis->thread->ReadAxes(pThis->thread->DevHandle[1]); Sleep(50); } else pThis->thread->tBool = TRUE; // } }Wer kontrolliert wie oft diese Schleife durchlaufen wird?
Muss dies immerwieder geschehen, bis Du Stop sagst?
Oder muss dies nur einmal geschehen?Ich kenne denn Sinn Deines Threads nicht. Du sagst nicht, wer was wie steuert.
Dein Thread kann (im Prinzip) so ausehen wie der jetztige, wenn er tut was er soll
Den Quatsch mit AfxEndThread kannst Du Dir sparen. Ein simpler return aus der Thread funktion ist einfacher zu verstehen und modularer und macht aus was Du möchtest.
-
Der Sinn des Thread ist, dass er IMMER läuft. Er läuft so lange bis ich sage "Stop" oder das Programm beendet wird. Eine Kontrolle, wie oft die Schleife durchlaufen wird ist nicht nötig.
In der (Endlos)Schleife werden alle 50ms (Sleep) daten von USB gelesen (ReadAxes).
Wenn ich außerhalb des Threads die var. tBool setzte wird er beendet (kommt nur zum Programmbeenden vor).Den Thread musste ich machen, da wenn ich das direkt in den Hauptthread gepackt hätte mein Dialog nicht mehr auf Eingaben Reagieren würde.
MIr war eigentlich nur wichtig ob ich den Thread für manuelle Eingaben unterbrechen / Anhalten sollte oder ob ihn einfach vor sich hintingeln lassen soll. Das Programm soll über längere Zeit stabil laufen.
-
Wie lange dauert ReadAxes? Würde ein Timer nicht genügen?
Wie schützt Di die Daten die gelesen werden gegen gemeinsamen Zugriff in ReadAxes?Lass ihn doch laufen, wenn er tut was er soll. Ich empfinde die Belastung nur immens, wenn das Ding permament läuft. Muss das sein?
Warum auf Eingaben warten, warum unterbrechen?
-
Wie lange dauert ReadAxes?
ReadAxes dauert vllt. 500ms (kommt auf die Auslastung des Rechners an).
Würde ein Timer nicht genügen?
Einen Timer in den Thread? Oder wie soll ich das verstehen?
Wie schützt Di die Daten die gelesen werden gegen gemeinsamen Zugriff in ReadAxes?
Die gelesenen Daten geb ich nur aus, bzw. schick sie an eine Funktion, die mir aus den diversen Hex-Werten einen lesbaren Wert macht.
Ich empfinde die Belastung nur immens, wenn das Ding permament läuft. Muss das sein?
Wie soll ich das denn sonst hinbekommen? Die Abfragen sollen ja Permanent ablaufen (sind im Prinzip Achswerte x;y;z). Und große Belastungen hab ich auch nach einem Testlauf von 30 Minuten nicht bemerkt.
Warum auf Eingaben warten, warum unterbrechen?
Mit eingaben mein ih z.B. ein neues USB-Gerät wurde angestöpselt (nutze WM_DEVICECHANGE) oder wenn ich eine art Kalibrierung durchfürhrem muss auf dem gerät.
-
Uruk-h4j schrieb:
Wie lange dauert ReadAxes?
ReadAxes dauert vllt. 500ms (kommt auf die Auslastung des Rechners an).
Das dauert ja länger als dein Auslese-Zyklus - ist das Absicht?
Würde ein Timer nicht genügen?
Einen Timer in den Thread? Oder wie soll ich das verstehen?
Einen Timer anstelle des Threads (einmal starten und in der Timer-Funktion dann einen ReadAxes()-Aufruf durchführen).
Wie schützt Di die Daten die gelesen werden gegen gemeinsamen Zugriff in ReadAxes?
Die gelesenen Daten geb ich nur aus, bzw. schick sie an eine Funktion, die mir aus den diversen Hex-Werten einen lesbaren Wert macht.
Es ging um Schutz bzw. Synchronisation der Datenzugriffe (zwischen ReadAxes() und fremden Programmen, die diese Werte verändern könnten - irgendwen dürfte es da geben), nicht um die Weiterverarbeitung in deinem Programm.
-
Ich kann nicht genau sagen wie lange das auslesen vom USB dauert. Hängt immer davon ab wie viel auf dem rechner los ist.
Einen Timer hatte ich ausgeschlossen, da ich wärend des Programmablaufs ein Paar Buttons habte, die man Betätigen können soll wenn ich vom USB lese. Ich werd aber mal spaßeshalber eine Timerfunktion einbauen und schauen wies sich allgemein verhällt. Vllt reichts ja doch für meine Zwecke.
Es ging um Schutz bzw. Synchronisation der Datenzugriffe (zwischen ReadAxes() und fremden Programmen, die diese Werte verändern könnten - irgendwen dürfte es da geben), nicht um die Weiterverarbeitung in deinem Programm.
Hmm... darüber müsste ich mal nachdenken. Hab bis jetzt noch keine Probleme gehabt. Gäbe es das Problem denn auch, wenn ich den Timer nehmen würde?
-
[GELÖST] -> Thread kann zu
So ich hab nun den Timer anstelle des Thread drin. Scheint auch soweit gut zu funktionieren. Werds mal so lassen und schaun wie es sich in der Praxis unter "erschwerten" Bedingungenen macht.
Danke auf jedenfall für Eure Hilfe und Ausdauer mit mir ^^