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 haben

    Danke Gruss Windalf


Anmelden zum Antworten