Dialog nach abgelaufener Zeit beenden ?



  • Hallo Leute,

    Ich möchte gerne ein Modales Dialog das geöffnet wurde in 60 sec automatisch schließen lassen.

    Ich erstelle mir einen Thread, der beim aufruf des Dialoges gestartet wird und in einer Schleife (60 mal) runter gezählt wird.

    Nach beendigung der Schleiffe mache ich ein OnOK().

    Dort bekomme ich aber einen Runtime Error. Mit OnCancel() klappt das. Dann schließt sich mein Dailag aber nicht.

    void CDialogWarten::thrRun()
    {
    	int i;
    	int m_iZaehlerZurueck = m_iDauer;
    	for(i = 0; i <= m_iDauer; i++)
    	{
    		std::string m_strText = "Dialog wird in 60 sec. beendet !";
    		m_AnsageText.SetWindowText(m_strText.c_str());
    		m_ProcessWarten.SetPos(CUtil::fProzentAnteil(m_iDauer,i));
    
    		m_iZaehlerZurueck--;
    		Sleep(1000);
    	}
    }
    

    Kann mir jemand helfen ??

    Gruß
    andy_mann



  • Versuchs mal mit :

    PostMessage(WM_CLOSE);
    

    Gruß
    :: NoName ::



  • Was spricht denn gegen die Verwendung einers Timers ? Die schicken nämlich genau nach Ablauf einer vorgegebenen Zeitspanne eine Message und tun damit (vermutlich) genau das was willst.

    mfg JJ



  • Vielen Dank,

    Also das mit der

    PostMessage(WM_CLOSE);
    

    klappt, allerdings sendet er mir kein OnOK().

    Ich brauche dies, dass ich weis wann das Dialog geschloßen wurde, dass ich darauf regieren kamm.

    Wie bekomme ich es jetzt hin, dass er ein OnOK() macht ??

    Gruß
    andy_mann



  • Entweder OnOK direkt aufrufen oder SendMessage(MAKEWPARAM(IDOK,WM_COMMAND)); Außerdem wäre die Verwendung eines Timers etwas angebrachter, das wurde auch bereits erwähnt...



  • Also Ok, ich habe mich übereden lassen und habe jetzt einen Timer eingesetzt.

    Jetzt habe ich allerdings das Problem, dass ich im Dialog nirgens was bestätigen kann, weil der Timer mir dies sperrt.
    Also läuft er durch.

    Starten tue ich Ihn in

    BOOL CDialogWarten::OnInitDialog()
    {
    	CDialog::OnInitDialog();
             m_iDauer = 10;
    	SetTimer(1, 100, NULL); // 1/10 Sekunde
    
             return TRUE;
    }
    

    Dann rufe ich den Timer auf und lasse Ihn einmal durchlaufen.

    void CDialogWarten::OnTimer(UINT nIDEvent)
    {
    	// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
    
    	int m_iZaehlerZurueck = m_iDauer;
    	for(int i = 0; i <= m_iDauer; i++)
    	{
    		std::string m_strText = "Der Process in " + CUtil::fIntinSTDString(m_iZaehlerZurueck) + " sec. beendet !";
    		m_AnsageText.SetWindowText(m_strText.c_str());
    		m_ProcessWarten.SetPos(CUtil::fProzentAnteil(m_iDauer,i));
    
    		m_iZaehlerZurueck--;
    
    		Sleep(1000);
    	}
    	CDialog::OnOK();
    }
    

    Ich möcht aber, dass der User dies beenden kann...

    Wie mache ich das ??

    Gruß
    andy_mann



  • Warum nimmst du als Zeit nicht eine Sekunde statt einer Zehntel.

    Der Timer sendet Nachrichten und die Maus und Tastatur auch. Wenn du die Nachrichtenschleife vollstopfen läßt ist es kein Wunder, wenn der Dialog nicht mehr reagiert. 😉



  • Weg mit Sleep und der Schleife! Bei jeder WM_TIMER Nachricht in- bzw. dekrementierst du deinen Counter und wenn die gewünschte Anzahl der Sekunden erreicht ist oder überschritten wird, killst du den Timer und rufst OnOK auf:

    //OnTimer
    
    if (++sec >= 60 {
        KillTimer(/* ... */);
        OnOK();
    }
    


  • Vielen Dank,

    jetzt hat es gefunzt..

    Gruß
    andy_mann


Anmelden zum Antworten