Steuern von Verhalten von Funktion eines Hauptthreads aus Subthread
-
Morgen allerseits,
ich habe in meinem Hauptthread meines Dienstapplikation eine Funktion laufen die bei einem bestimmten Ereignis eine in dieser Funktion laufende Schleife beenden soll.
Ich habe jetzt versucht mit Hilfe eines Events dieses zu steuern.In der Funktion des Hauptprozesses kreiere ich meinen Event
HANDLE g_hStopRecord = 0; void meineFunktion() { g_hStopRecord = CreateEvent(NULL, false, false, NULL); while(running) { if(WaitForSingleObject(g_hStopRecord, 0) == WAIT_OBJECT_0) break; ....//Aufgaben abarbeiten. } } //Thread void meinThread(void* pVoid) { int nl = recvfrom(socket, buf, maxbuffersize, 0, (SOCKADDR*)&sockAddr, &sizeofsockaddr); if(nl > 0) { if(strcmp(buf, neededMsg) == 0) { SetEvent(g_hStopRecord); } } }Das Problem ist, das es ca 4 - 5 Sekunden dauert bis die Funktion merkt, dass der Event gesetzt wurde.
Wie kriege ich das schneller hin?
Bin in der Thread Programmierung noch ziemlicher Anfänger.Gruß
-
Wenn Du den Event nur alle 4-5 Sekunden abfragst, dann kann der Thread sich auch nicht schneller beenden...
-
Ein Schleifendurchlauf benötigt max. 200ms.
Wie kommst du drauf ich würde nur alle 4 - 5 sekunden abfragen?
-
Ich fragte das mit dem wie du darauf kommst, ob ich vllt was wichtiges übersehe.
-
Wenn der Event gesetzt ist, dann wird beim nächsten Schleifendurchlauf auch erkannt das der Event gesetzt ist. Folge richtig dauert das bei einem Schlifendurchlauf von 200msec genau maximal 200msec.
Es gibt keine Verzögerung bei den Evemts bis etwas "gemerkt" wird!
Ich habe einfach mal vermutet, dass der Schleifendurchlauf eben besagt 4sec dauert.
Könnte es sein, dass recvfrom nicht so schnell eine Info liefert wie Du glaubst.
Bau einmal Traces ein mit der Ausgabe von GetTickCount!
Du wirst sehen, dass SetEvent und der WaitForSingleObject direkt aufeinander folgen....
-
Guten Morgen,
ich habe jetzt mal mit GetTickCount gemessen.
Ein Schleifendurchlauf benötigt ca. 15 - 25 ms.
Zwischen SetEvent und WaitForSingleObject sind es immer so um 4700 ms.Was kann denn da falsch laufen?
-
Und Du bist sicher, dass die Trace-Ausgaben an der richtigen Stelle sitzen?
Ansonsten würde ich sagen: Was Du schilderst geht nicht!

Wenn ich en kleines Testprogramm mache mit einem Sleep für den Schleifendruchlauf, dann habe ich den Thread in maxial eben 200msec beendet.
Oder hast Du eine extrem niedrige Prioritätä für Deinen Workerthread verwendet und der Thread, der den Event setzt hat ein so hohe Priom dass der andere Thread enfach nicht dran kommt?
-
Also die Ausgaben sind nach SetEvent(Also im Workerthread) und in Anweisungsblock
if(WaitForSingleObject(myEvent, 0) == WAIT_OBJECT_0) { TRACE("WaitFor: %d\n" GetTickCount()); }Im Hauptprozess bzw. -thread
Die Priorität des Workerthread ist THREAD_PRIORITY_HIGHEST bei SetThreadPriority. Also der Thread der den Event setzt.
-
Und der Trace vor dem SetEvent ist identisch.
Mach doch mal einen Tace immer vor dem Wait... nur dann siehst wie sauber wrklch die Schleife durchläuft. Und ich schließe eine Wette ab, dass nach dem SetEvent eben keine Trace-Ausgabe mehr von dem Thread kommt, der auf das Ende warten soll.Was macht der Thread, der SetEvent ausführt danach. Ist der am schuften ohne Ende? Setze die Thread Prio doch mal auf Normal!
Warum denn überhaupt highest? Was versprichst Du Dir davon?
-
Tüdelü Tüdelü...
Magst mir prügeln???

Wenn man select einen Timeout von 5 sec mitgibt sollte man danach mal schauen...
Der war schuld!!!
Manchmal sieht man auch den Wald vor lauter Bäumen nicht.Aber danke, hat mir dennoch geholfen wieder ein wenig mehr zu verstehen

-
Ich vermute eher, dass er ein Prio Problem hat... und zu wenige CPUs

Wer mit Prios rumspielt, sollte schon genau wissen, was er tut
