8
votes

Comment arrêter un processus à l'aide d'un "bouton d'arrêt"

J'ai créé une fenêtre simple avec deux boutons, Le premier appelle une fonction qui dure longtemps, La seconde définit la valeur d'une variable "stop" à true, qui a été initialement réglé sur faux.

Mon intention est que, en appuyant sur le premier bouton, il exécute un processus long, qui contrôle si la variable d'arrêt est définie sur true ou false pour chaque boucle, Si la valeur est vraie, la fonction devrait renvoyer, le processus est donc arrêté. p>

...

static BOOL stop = FALSE;   // My variable defined somewhere

...

int longProcess ()   // My function
{
    while(stop == FALSE) {
         // do something
    }
    return 0;
}

...

switch (msg)
{
    case WM_CREATE:
    {
                            ...

        Button1 = CreateWindowEx(0, 
                                         TEXT("BUTTON"),
                                         TEXT("Start"),
                                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                                         100, 100, 100, 20,
                                         hWnd,
                             (HMENU)BUTTON_START,
                             NULL,
                                         NULL);

        Button2 = CreateWindowEx(0,
                           TEXT("BUTTON"),
                       TEXT("Stop"),
                       WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                       200, 200, 100, 20,
                               hWnd,
                               (HMENU)BUTTON_STOP,
                               NULL,
                               NULL);
                             ...

    }
    break;

    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {

                        case BUTTON_START:
                            longProcess();   // Starts the process
                break;

                        case BUTTON_STOP:
                            stop = TRUE;  // Should stop the process
                break;

        }
    }
    break;

    ...

}


1 commentaires

Bienvenue dans le monde de la programmation simultanée!


5 Réponses :


13
votes

Vous devez exécuter le processus long sur un thread séparé et votre approche devrait fonctionner.

Ceci est, au lieu d'appeler simplement Fonction LongProcess ON Bouton de démarrage Cliquez sur , Créez un thread et exécutez le processus long.

Ce qui se passe est que votre long processus bloque votre fil d'interface utilisateur, responsable de la manipulation des événements de l'interface utilisateur. Donc, Bouton d'arrêt Cliquez sur ne sera pas traitée avant que longprocess () finitions.


0 commentaires

5
votes

dans Delphi, nous avons une application.ProcessMessages () qui traite essentiellement tous les messages et retours en attente. Et vous pouvez mettre cette ligne pour faire du vélo pour rendre UI plus réactif.

avec fonction de ce que vous pouvez faire ce xxx

éditer: Ceci s'applique si vous ne voulez pas scinder le code pour séparer le fil - Solution de contournement Quick'n'Dirty


1 commentaires

Dans Windows, il est getMessage / DispatchMessage



3
votes

Que diriez-vous d'utiliser PeekMessage ? xxx


0 commentaires

3
votes

Au minimum, vous devrez déclarer votre variable avec le mot clé volatile . Mais la meilleure façon de le faire est d'utiliser un événement. CreateEevent () Pour l'initialiser, SetEvent () Pour signaler la condition d'arrêt, WaitforSingleObject () avec un délai d'attente pour le tester.


0 commentaires

1
votes

Variation de la réponse d'Aoi Karasu, MFC a CWITHREAD :: PumpMessage ().

Je l'utilise dans les boucles de fil de travailleur pour les garder réactives. Cela fonctionne bien.


0 commentaires