So stoppen Sie einen Prozess mit einem "Stop Button"

8

Ich habe ein einfaches Fenster mit zwei Tasten erstellt, der erste nennt eine Funktion, die eine lange Zeit dauert, die zweite setzt den Wert einer Variablen "stop" auf TRUE, das war ursprünglich auf FALSE gesetzt.

Meine Absicht ist, dass durch Drücken der ersten Taste ein langer Prozess ausgeführt wird, das steuert, ob die stop-Variable für jede Schleife auf TRUE oder FALSE gesetzt ist, Wenn der Wert TRUE ist, sollte die Funktion zurückkehren, damit der Prozess gestoppt wird.

%Vor%

}

Das Problem ist, dass wenn ich die erste Taste drücke, der Prozess normal startet, aber wenn ich den zweiten Knopf drücke, um den Prozess zu stoppen passiert nichts, Ich habe festgestellt, dass die Stop-Variable erst nach dem Ende des Prozesses auf TRUE gesetzt wird. Ich dachte, dass wahrscheinlich in einem Problem im Zusammenhang mit der Nachrichtenwarteschlange ...

Was könnte die beste Lösung sein ??? Es ist richtig, longProcess () dort und auf diese Weise aufzurufen? (Ich bin ein Neuling :))

Danke!

    
mario 05.08.2010, 12:35
quelle

5 Antworten

13

Sie müssen den langen Prozess in einem separaten Thread ausführen und Ihr Ansatz sollte funktionieren.

Dies bedeutet, dass Sie nicht nur longProcess function auf Start Button Click aufrufen, sondern einen Thread erstellen und den langen Prozess darauf ausführen müssen.

Was passiert, ist, dass Ihr langer Prozess Ihren UI-Thread blockiert, der für die Behandlung von UI-Ereignissen verantwortlich ist. Das heißt, Stop Button Click wird erst behandelt, wenn longProcess() beendet ist.

    
Pablo Santa Cruz 05.08.2010, 12:36
quelle
5

In Delphi haben wir Application.ProcessMessages (), die im Grunde alle ausstehenden Nachrichten verarbeitet und zurückgibt. Und Sie können diese Zeile in einen Zyklus versetzen, um UI mehr ansprechend zu gestalten.

Mit dieser Funktion könntest du das machen

%Vor%

BEARBEITEN: Dies gilt, wenn Sie den Code nicht in einen separaten Thread aufteilen möchten - Quick'n'Dirty Workaround

    
Im0rtality 05.08.2010 12:47
quelle
3

Wie wäre es mit PeekMessage ?

%Vor%     
Aoi Karasu 05.08.2010 13:07
quelle
3

Zumindest müssen Sie Ihre Variable mit dem Schlüsselwort volatile deklarieren. Aber der beste Weg, dies zu tun, ist ein Ereignis zu verwenden. CreateEvent (), um es zu initialisieren, SetEvent (), um die Stoppbedingung zu signalisieren, WaitForSingleObject () mit einer Zeitüberschreitung von 0, um es zu testen.

    
Hans Passant 05.08.2010 14:05
quelle
1

Als eine Variation von AOI Karasus Antwort hat MFC CWinThread :: PumpMessage ().

Ich verwende es in Worker-Thread-Loops, um sie ansprechend zu halten. Es funktioniert großartig.

    
JustBoo 05.08.2010 15:35
quelle

Tags und Links