Workerthread Synchronisation
-
Hallo,
weiß jmd wie man einen workerthread schützen kann, so dass dieser immer nur einmal gleichzeitig ausgeführt werden kann?
Was passiert genau, wenn eine zweite Anfrage ankommt, die diesen Thread ausführen möchte?
Wird dieser Thread dann geblockt? Können in dieser Zeit dann Nachrichten POST_MESSAGES etc. empfangen werden, wenn es sich z.B. um den Mainthread handelt?Gruß
Bernd
-
Was meinst Du mit "einmal nur ausgeführt wird"? Wenn ein Thread einmal gestartet wird wird er nur einmal ausgeführt.
Nachrichten werden nur empfangen wenn GetMessage/PeekMessage ausgeführt wird.
-
Martin Richter schrieb:
Was meinst Du mit "einmal nur ausgeführt wird"? Wenn ein Thread einmal gestartet wird wird er nur einmal ausgeführt.
Nachrichten werden nur empfangen wenn GetMessage/PeekMessage ausgeführt wird.Dieser Workerthread kann ja bereits ausgeführt werden, und gleichzeitig kann es aber sein, dass er nochmal gestartet wird. Und dieses Szenario möchte ich unterbinden.
Den letzten Satz hab ich jetzt nicht ganz verstanden: Wenn es möglich ist mit Criticalsections den Versuch zu blocken, den Workerthread 2x oder öfters auszuführen (gleichzeitig), wird doch der Mainthread, in dem der Workerthread gestartet wird, geblockt oder? Können in diesem Zusammenhang aber trotzdem PostMessages etc. im Mainthread empfangen und verarbeitet werden? Oder wirkt dieses Blocken des Mainthreads wie ein Sleep()?
//nur ganz schnell als Example gecoded: void Mainthread::StartThread(void) { criticalsection.lock(); AfxBeginThread(Workerthread, Params, etc....); criticalsection.unlock(); }
Gruß
Bernd
-
Bernd09 schrieb:
Martin Richter schrieb:
Was meinst Du mit "einmal nur ausgeführt wird"? Wenn ein Thread einmal gestartet wird wird er nur einmal ausgeführt.
Nachrichten werden nur empfangen wenn GetMessage/PeekMessage ausgeführt wird.Dieser Workerthread kann ja bereits ausgeführt werden, und gleichzeitig kann es aber sein, dass er nochmal gestartet wird. Und dieses Szenario möchte ich unterbinden.
Den letzten Satz hab ich jetzt nicht ganz verstanden: Wenn es möglich ist mit Criticalsections den Versuch zu blocken, den Workerthread 2x oder öfters auszuführen (gleichzeitig), wird doch der Mainthread, in dem der Workerthread gestartet wird, geblockt oder? Können in diesem Zusammenhang aber trotzdem PostMessages etc. im Mainthread empfangen und verarbeitet werden? Oder wirkt dieses Blocken des Mainthreads wie ein Sleep()?
//nur ganz schnell als Example gecoded: void Mainthread::StartThread(void) { criticalsection.lock(); AfxBeginThread(Workerthread, Params, etc....); criticalsection.unlock(); }
Gruß
BerndMacht das so Sinn? Returniert nicht AfxBeginThread einen Zeiger auf das CWinThread-Objekt?
Ich würde im Workerthread ein Event setzen und beim Aufruf von AfxBeginThread prüfen, ob das Event gesetzt ist oder nicht. Damit könnte man prüfen, ob eine Instanz bereits existiert.
-
Er braucht sich doch nur das Handle des Threads zu merken und wenn wieder ein neuer gestartet werden soll mit GetExitCodeThread() zu erkunden ob der Thread noch läuft. Wobei die andere Frage ist der Thread durch einen Button gestartet wird, dann sollte dieser disabled werden.
-
CTecS schrieb:
Er braucht sich doch nur das Handle des Threads zu merken und wenn wieder ein neuer gestartet werden soll mit GetExitCodeThread() zu erkunden ob der Thread noch läuft. Wobei die andere Frage ist der Thread durch einen Button gestartet wird, dann sollte dieser disabled werden.
So einfach geht es leider nicht. Der Thread kann durch einen Button gestartet werden, aber auch durch den integrierten Webserver; und hier gibt es diese Möglichkeit nicht.
Ich möchte auch, dass der Thread natürlich immer gestartet wird, jedoch immer nur eine Instanz läuft. Sprich, wenn eine weitere Anfrage anliegt, darf die nicht unter den Tisch fallen, sondern diese Anfrage muss warten bis Sie ausgeführt werden kann. Und dazu fehlt mir scheinbar noch die richtige Technik, das zu bewerkstelligen.
Gruß
Bernd
-
noch eine andere Frage: für einen Workerthread benötigt man ja auch immer ein CView / Dialog Class, um diesen Thread im Falle eines Schließens vom Programm ebenfalls schließen zu können.
Wenn jetzt die Daten die im Worker thread verifiziert werden sollen sowohl über einen Dialog als auch über den Webserver kommen können, welche Klasse verwendet man dann im Normalfall für den Shutdown-Mechanismus?
Ich hab eine Klasse, die alle Informationen die für die Verifizierung benötigt werden. Diese kann über eien globale Variable angesprochen werden. Sollte man dann innerahlb dieser Klasse auch den Worker Thread starten und eine Extraklasse (abgeleitet von CView) bereitstellen für das Beenden des Worker threads?
-
Was hat ein Workerthread mit DocView zu tun? Je nach Deiner Konstruktion kannst Du den Workerthread als Singleton betrachten oder mit einer Klasse verbinden...
-
Martin Richter schrieb:
Was hat ein Workerthread mit DocView zu tun? Je nach Deiner Konstruktion kannst Du den Workerthread als Singleton betrachten oder mit einer Klasse verbinden...
Mit dem Doc/View hat es nichts zu tun, aber wenn die Applikation geschlossen werden soll und der Worker Thread noch läuft muss ich ja dafür Sorge tragen können, dass dieser Workerthread auch geschlossen wird; und dafür benötigte ich eine Viewclass, welche Informationen PostThreadMessages aus dem Mainframe erhalten kann, wenn Mainframe::OnClose() aufgerufen wird.
-
lieg ich mit meiner Annahme völlig daneben, oder ist es dann schon sinnvoller einen UI-Thread zu verwenden und diesen nach der Aufgabe wieder killen.
-
Hans im Glück, Konrad F., Bernd09 - was soll denn das?
Kannst du dich nicht einfach als Mitglied anmelden?
siehe hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-275567-and-highlight-is-.htmlEdit:
Registrieren kann man sich hier (kostenlos!):
http://www.c-plusplus.net/forum/profile-var-mode-is-register.html
-
Also das mit den Thread starten wegen ner Anfrage is doch totale quatsch meiner Meinung, der Thread soll doch nur irgendwelche Anfrage irgendwo machen, also läuft der Thread immer und wartet das er eine Anfage zu bearbeiten hat, woher die kommt is doch in dem Fall egal. Die Anfragen werden einfach in eine Pipe (also eine Liste) geschrieben und der Thread arbeitet die der Reihe nach ab. Sind keine Anfragen da wartet der thread das wieder welche kommen. wird dein hauptprogramm beendet, beendest du den Thread. Also ch seh da kein Problem und wenn dann der Anfrager Daten wieder zurück erhalten soll, dann gibt es sicher auch dafür eine Lösung, aber dein ständiges Thread-Starten ist sicher nicht die richtige Lösung.
Wenn du jetzt mal noch mehr erklären würdest wie das abläuft, also wer anfragen stellt, wie die aussehen und ob sie Daten zurück bekommen, wirst du hier sicher ne schnellere Lösund Vorgeschlagen bekommen, als wenn du weiter nur unsere Vermutungen dementierst und dann wieder bissel was neues erzählst