CDialog von Thread beenden lassen
-
hmm angenommen ich habe einen Dialog gestartet bei dem sofort ein Thread gestartet wird der immer wieder das eine oder andere tut...
DWORD ValidierungDlg::LivepicsThread(LPVOID lparam){ ValidierungDlg *dp = ((ValidierungDlg*)lparam); while(!dp->endflag){ while(dp->livepicsFlag) dp->PaintPics(); if(dp->taskflag==2)//Validieren dp->Validieren(); if(dp->taskflag==3)//Parameter laden dp->ParameterWiederherstellen(); if(dp->taskflag==4)//Parameter speichern dp->ParameterSpeichern(); dp->livepicsFlag=1; } // dp->endflag=0; dp->EndDialog(0); return 0; }so und nun zu meinem problem... eigentlich wollte ich wenn der EndeButton gedrückt wird das so abläuft das das das endflag gesetzt wird und ich dann solange warte bis der Thread durch ist um danach den Dialog zu killen
also in der endebuttonmehtode solls so aussehen
taskflag=-1; endflag=1; livepicsFlag=0; //im moment sind diese beiden zeilen auskommentiert weil ich enddialog im thread aufrufe was aber irgendwie ziemlich unschön ist while(!endflag) Sleep(100); EndDialog(0);wenn ichs allerdings mit der whileschleife mache hängt der in der buttonmehtode fest und der thread bekommt keine rechenzeit mehr... endlosschleife und verloren... was muss ich machen damit der threadzuende durchläuft?
-
hmm hat keiner ne Idee oder hab ich mein Problem zu schelcht beschrieben?
Wenn irgendwas unklar ist fragt bitte nach
-
Ich mache das immer so wie in der FAQ beschrieben. Eine von CWinThread abgeleitete Klasse. Den Threadhamdle überprüfe ich im Dialog ob der Thread noch läuft.
-
ob ich das bei mir per Threadhandle mache oder mit einem flag das von dem Thread gesetzt wird kommt bei mir aufs gleiche...
Hab beides mit dem selben nichterfolg probiert... Problem ist halt wie bring ich ihn dazu das der Thread weiterläuft wenn ich in der Buttonmehtode bin
-
Please HEEEEEEEELLLLLLP
weiss denn keiner wie ich das Porblem lösen kann?
Mit so harten Bandagen wie TerminateThread oder so rangehen kann ja wohl kaum ne Lösung brauchbare Lösung sein oder?
-
Mit so harten Bandagen wie TerminateThread oder so rangehen kann ja wohl kaum ne Lösung brauchbare Lösung sein oder?
nö, hab bisher noch keine einzige brauchbare anwendung von TerminateThread gesehen..
machs so:
void MyClass::StarThread() { // mach dir event zu anhalten des threads HANDLE m_hStopEvent = CreateEvent(NULL,FALSE,FALSE,NULL); // hier wird der thread gestartet HANDLE m_hThread = _beginthread(MyThread,0,this); } void MyClass::MyThread(void *p) { //... while(WaitForSingleObject(dp->hStopEvent,0)==WAIT_TIMEOUT) { // bla } } void StopThread() { // sag dem thread das jetzt schluss ist SetEvent(m_hStopEvent); // warte bis er fertig hat WaitForSingleObject(m_hThread,INFINITE); // schließe deinen dialog oder was auch immer }
-
das bringt ihn nichts da die anwendung dann nicht reagiert. sollte der Thread noch > 5 Sekunden dauern ist das nicht gerade schön.
Ich habe dir die Lösung gesagt. Also versuche es so oder vergiss es. eine andere kenne ich nicht.
-
@Unix-Tom
Jo ich werds probieren hab jetzt aber gerade keinen Nerv mehr dafür... mach ich demnächst und werde dann eventuell noch Rückfragen habenDanke Gruss Windalf