Schleife mit Buttonclick abbrechen



  • Hallo,

    ich habe eine Schleife, die ziemlich lange läuft und dabei etwas berechnet. Ich möchte aber diese Schleife gegebenenfalls mit einem Buttonclick beenden.

    Das Problem ist, dass während der Berechnung alles blockiert ist und das Programm natürlich nicht auf Klicks reagiert. Gibt es eine Möglichkeit so etwas zu realisieren ?

    Ich versuche die Verwendung von Threads zu vermeiden.



  • nfaa schrieb:

    ich habe eine Schleife, die ziemlich lange läuft und dabei etwas berechnet. Ich möchte aber diese Schleife gegebenenfalls mit einem Buttonclick beenden.

    Das müsste mit break gehen...

    nfaa schrieb:

    Das Problem ist, dass während der Berechnung alles blockiert ist und das Programm natürlich nicht auf Klicks reagiert. Gibt es eine Möglichkeit so etwas zu realisieren ?

    Du musst Threads benutzen...
    Such mal im Board unter Threads...

    Gruß
    :: NoName ::



  • Hi,

    ich denke was Du suchst ist viel einfacher als threads:

    Bau einfach in die Schleife, die so lange läuft folgendes ein:

    if (::PeekMessage(&message,NULL,0,0,PM_REMOVE)) 
    { 
        ::TranslateMessage(&message); 
        ::DispatchMessage(&message); 
    }
    

    Damit wird eine Weiterleitung/Verarbeitung von Ereignissen gewährleistet und Du kannst während der Verarbeitung auch andere Programme verwenden.

    Gruss

    yeti



  • yeti schrieb:

    Hi,

    ich denke was Du suchst ist viel einfacher als threads:

    Bau einfach in die Schleife, die so lange läuft folgendes ein:

    C/C++ Code:
    if (::PeekMessage(&message,NULL,0,0,PM_REMOVE))
    {
    ::TranslateMessage(&message);
    ::DispatchMessage(&message);
    }
    C/C++ Code:
    if (::PeekMessage(&message,NULL,0,0,PM_REMOVE))
    {
    ::TranslateMessage(&message);
    ::DispatchMessage(&message);
    }
    C/C++ Code:
    if (::PeekMessage(&message,NULL,0,0,PM_REMOVE))
    {
    ::TranslateMessage(&message);
    ::DispatchMessage(&message);
    }

    Damit wird eine Weiterleitung/Verarbeitung von Ereignissen gewährleistet und Du kannst während der Verarbeitung auch andere Programme verwenden.

    Gruss

    yeti

    Stimmt schon, aber das Programm ist trotzdem leicht "gebremst", manchmal stockt es ein wenig...

    Gruß
    :: NoName ::



  • Hi,

    stimmt schon, dass die Sache etwas langsamer wird, aber von "Stocken" möchte ich da absolut nicht sprechen - und bevor man sich auf das Gebiet der Threads begibt, ist das sicher noch die einfachere Lösung...

    Gruss

    yeti



  • verschieb die schleife in einen workerthread.......
    (kannste ja im hauptthread eine progressbar deiner schleife anzeigen....)



  • Danke für die Antworten.

    Blöde Frage, was soll ich für "&message" einsetzten ?



  • ah
    MSG message;

    Allerdings ist das schon ganz schön träge.

    Mein Programm benutzt den Sleep-Befehl um in der Schleife immer 1s pause zu machen.
    Kann ich die zeit irgendwie nutzen ? So nach dem Motto: an dieser Stelle 1s lang die Schleife pausieren und in der Zeit die Nachrichtenverarbeitung einschalten.



  • MSG message;
    
    while(1)
    {
        if(PeekMessage(&message,NULL,0,0,PM_REMOVE)
        {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
        // hier deine datenverarbeitung
    }
    

    Ich würde auch zu einem Thread raten.


Anmelden zum Antworten