CancelButton zum beenden verwenden



  • hoi ich hab folgendes Problem....
    wenn mein Dialog started wird automatisch ein Thread gestarted der immer wieder rechnungen und anderes aktualisiert und in abhängigkeit von bestimmten einstellungen des users updated...

    das funktioniert insoweit auch schon ganz gut

    DWORD CMyDlg::LivepicsThread(LPVOID lparam){
    
    	CMyDlg *dp = ((CMyDlg*)lparam);
    
    	while(!dp->endflag){
    	   dp->DoSomething();
                Sleep(60);
    	}
    
    	::PostMessage(dp->m_hWnd,WM_CLOSE,NULL,NULL);
    
    	return 0;
    }
    

    auf dem button der den dialog beendet wird dann einfach endlfag auf 1 gesetzt und der ganze spass läuft auch durch...

    jetzt will ich abe auch das wenn ich auf das kreuz rechts oben geklickt wird das gleiche passiert

    dazu hab ich onCancel überladen

    void CMyDlg::OnCancel(){
    	CDialog::OnCancel();
    	endflag=1;
    }
    

    leider funktioniert das nicht aus folgenden grund... wenn man sich in ner buttonmehtode oder irgend ner anderen aus dem dialog befindet werden die anderen threads gestoppt so lange bis dieser durch ist... im falle eines Extra buttons ist das kein problem der setzt das flag auf 1 der thread läuft danach zuende und fertig ist... wenn ich in der OnCancel-Mehtode bin will diese ja selber den Thread beenden lässt diesen aber gar nicht mehr zu wort kommen. WaitForSingleObject und solche dinge führen zu endlosschleifen...
    Wie muss man das angehen damit ich auch den Cancelbutton dafür benutzen kann?...



  • Du musst den Thread mitteilen das er sich beenden soll und dann wartest du darauf.



  • @Unix-Tom
    und wie mach ich das bitte?

    der Thread bekommt ja keine rechenzeit mehr wenn er erstmal in der OnCancel-Methode ist... das einzige was funzt ist TerminateThread und das kanns ja wohl nicht sein...



  • dazu hab ich onCancel überladen

    void CMyDlg::OnCancel(){
    	CDialog::OnCancel();
    	endflag=1;
    }
    

    [/quote]

    ich würde die reihenfoplge umdrehen und vll mit sleep rechnerzeit abgeben

    void CMyDlg::OnCancel(){
    	endflag=1;
    	Sleep(0);
    	CDialog::OnCancel();
    }
    


  • hab ich auch schon probiert...
    der gibt leider an seine unterthreads keien rechnerzeit ab auch wenn ich Sleep reinpacke (der dumme penner)...

    sagt mir bitte nicht das das bei euch anders ist wenn ich euch ein kleines beispiel zusammenklickt...

    ach so hatte ich vergessen zu erwähnen, wenn man ne messageBox schmeisst funzt es wieder dann ist er wieder breit rechenzeit zu teilen.
    Aber einfach nur die Threadpriority hochsetzen hat leider nicht geholfen...



  • keiner mehr ne Idee 😞



  • hmm das hier scheint zu funzen oder sieht da irgend jemand bedenken?
    wenn ja welche

    if(!endflag)
        endflag=1;
    else
        CDialog::OnCancel();
    


  • hallo, dieses problem hatte ich auch schonmal, bei mir waren es mehrere threads welche ebenfalls in einer while-schleife ein flag prüften, und hab es damals so gelöst das ich mit einem 2.flag prüfe ob der thread durch ist und dann erst beende...
    dh. beide flags werden beim start der threads gesetzt, mit dem ersten wird der thread kontroliert, beendet sich der thread setzt er das zweite flag auf false, dann erst wird der dialog beendet

    void CTestDlg::OnCancel() {}
    void CTestDlg::OnClose() { OnBeenden(); }
    
    void CRegisterDlg::OnBeenden()
    {
    	for ( int i = 0; i < m_iPortMax; i++ )
    		DeamonConfig[i].bMainLoop = false; // hier die flags auf false setzen
    	SetTimer(ID_TIMER1, 100, NULL);
    }
    
    void CRegisterDlg::OnTimer(UINT nIDEvent) 
    {
    	switch(nIDEvent)
    	{
    		case ID_TIMER1:// alle threads beenden, dann programm schliessen
    			{
    				int test = 0;
    				for ( int i = 0; i < m_iPortMax; i++ )
    					if ( DeamonConfig[i].bRunning )
    						test++;
    				if ( test == 0 )
    				{
    					KillTimer(ID_TIMER1);
    					// hier aufräumen
    					CDialog::OnOK();
    				}
    			}
    		break;
    	}	
    	CDialog::OnTimer(nIDEvent);
    	return;
    }
    

    das ist jetzt auch nicht die eleganteste lösung... aber funzt 😃

    grusz


Anmelden zum Antworten