Threadcode vorzeitig beenden
-
Eigentlich sagt der Titel schon alles
ich starte einen Thread aus meiner Dialogklasse
void CMyClass::start(){ AfxBeginThread(myThread, this); }
Den Thread habe ich wie folgt deklariert und definiert:
UINT myThread(LPVOID pData){ //zugriff auf public methode meiner dialogklasse myThread* pDlg = (myThread*) pData; if(pDlg->dosomething()){ // okay } else}{ // error } return 0 }
Naja, eigentlich nichts aussergewöhnliches, doch wie kann ich den Thread unterbrechen? z.B. wenn der User auf den Exitbutton klickt.
Ok, ich habe eine interne Variable kreiert, die gelegentlich in der Methode 'dosomething()' überprüft wird.
Setzte ich diese Variable auf false, geht es aber dennoch eine gewisse Zeit, bis 'doSomething()' dies realisiert und dann zurückkert... ja und der Rest des Threadcodes muss dann auch noch durchlaufen werden
WIE kann man den Thread besser beenden lassen oder wie erkenne ich genau, dass diese beendet ist?
Ich habe etwas von 'waitforsingleobject()' gelesen - doch wie und wo muss man das implementieren? ich stelle mir vor, dass wenn ich innerhalb der Dialogklasse diese Methode aufrufe, dass eben der Dialog bis zum Zurückkehren "stehen" bleibt - nicht wirklich toll, oder?
-
Ok, ich habe eine interne Variable kreiert, die gelegentlich in der Methode 'dosomething()' überprüft wird.
OK, im Prinzip kannst du für das beenden ganuso vorgehen. Am ende giebst du einer Variable einen Wert:
z.B.: m_bThreadTerminated = true;
in Deiner Exit - Funktion kannst du das dann checken:
int iMaxSlizeWaits = 10;//10 times try... while( (!m_bThreadTerminated) && iMaxSlizeWaits-- > 0 ) Sleep( 250 );
Mit WaitForSingelObject geht das natürlich noch ein bisschen Eleganter...
-
[quote="TheBigW"]
int iMaxSlizeWaits = 10;//10 times try... while( (!m_bThreadTerminated) && iMaxSlizeWaits-- > 0 ) Sleep( 250 );
quote]
das finde ich eben zu gefährlich, weil damit nimmt man an, dass man nach 10x250ms fertig ist - was ist aber, wenn der Threadcode immer noch aum aufräumen ist?
-
Das mußt du halt an Deine Gegebenheiten anpassen. Dann läßt du Ihn halt länger probieren. Wenn er schneller fertig sein sollte ist ja das bool dann true und er bricht ab. Letztendlich giebst du ja damit nur einen Timeout an, wann du nicht mehr warten willst
Ansonsten läßt du Ihn halt bei Threadinitialisierung ein Wait-Object creieren mit CreateEvent() und wartest dann mit WaitForSingleObject, bis du es am Ende selber mit SetEvent in den entsprechenden State setzt.