Endlosschleife --> Anwendung reagiert nicht --> über Button beenden



  • Durch Klicken auf einen Button soll eine Endlosschleife ("Interruptabfrage") gestartet werden. Leider "reagiert die Anwendung nicht mehr", da ständig die Abfrage durchgeführt wird und sie kann nur über den Taskmanager beendet werden.
    Gibt es eine Möglichkeit einen Button bzw. die Schließen-Schaltfläche trotz Endlosschleife im selben Formular "aktiv" zu behalten und den Benutzer die Anwendung über diesen Button beenden zu lassen?

    LG Philipp



  • Threads sollten helfen. Schau mal in die FAQ. Hab zu wenig ahnung von um details zu liefern. sry

    imho müsstest Du aber diese Schleife in einen Thread packen bzw. das Abbrechen durch einen hilfsthread erledigen lassen.



  • das ist doch dann kein interrupt, sondern Polling ( busy waiting auch gennant )

    oder irre ich mich da?



  • Servus,

    ka wie das mit den Threads geht aber ich mache das dann so:

    void CDeinDlg::PumpMessages()
    {
    	ASSERT(GetSafeHwnd() != NULL);
    	MSG msg;
    
    	while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    	{
    		if (!IsDialogMessage(&msg))
    		{
    			::TranslateMessage(&msg);
    			::DispatchMessage(&msg);
    		}
    	}
    }
    

    und dann in der schleife am Anfang am besten aufrufen:

    while(blabla)
    {
      PumpMessages();
    }
    

    dann reagiert auch dein DLG wieder...

    Musste mal testen...

    *winke*
    Hellsgore



  • Hellsgore schrieb:

    Servus,

    ka wie das mit den Threads geht aber ich mache das dann so:

    void CDeinDlg::PumpMessages()
    {
    	ASSERT(GetSafeHwnd() != NULL);
    	MSG msg;
    
    	while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    	{
    		if (!IsDialogMessage(&msg))
    		{
    			::TranslateMessage(&msg);
    			::DispatchMessage(&msg);
    		}
    	}
    }
    

    und dann in der schleife am Anfang am besten aufrufen:

    while(blabla)
    {
      PumpMessages();
    }
    

    dann reagiert auch dein DLG wieder...

    Musste mal testen...

    *winke*
    Hellsgore

    @Hellsgor

    DANKE, hat funktioniert!

    Problem dabei: Wenn die Anwendung über Schließen beendet wird, wird der Task nicht automatisch gecancelt (erscheint noch im Taskmanager).

    Hast du noch nen Tipp für mich? 😞

    LG
    Philipp



  • Hi!

    Bei eine Close-Message musst du natürlich aus deiner Endlosschleife ausbrechen. Deine Schleife wird doch sicher noch andere Abbruchbedingung haben oder? 😮



  • Andreas Kapust schrieb:

    Hi!

    Deine Schleife wird doch sicher noch andere Abbruchbedingung haben oder? 😮

    Nein (praktisch Polling mit while(1), es wird nur kurz die while-Schleife unterbrochen für die MessageBox)!

    LG
    Philipp


Log in to reply