如何使用"停止按钮"停止进程

mar*_*rio 8 c c++ winapi

我创建了一个带有两个按钮的简单窗口,第一个调用一个持续很长时间的函数,第二个调用变量"stop"的值设置为TRUE,最初设置为FALSE.

我的意图是,通过按下第一个按钮它会运行一个很长的进程,它控制每个循环的stop变量是设置为TRUE还是FALSE,如果值为TRUE,则函数应该返回,因此进程停止.

...

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;

    ...

}
Run Code Online (Sandbox Code Playgroud)

}

问题是,当我按下第一个按钮时,进程正常启动,但是当我按下第二个按钮以停止进程时没有任何反应,我注意到stop变量仅在进程结束后才设置为TRUE.我认为这可能是与消息队列相关的问题...

什么是最好的解决方案??? 以这种方式调用longProcess()是正确的吗?(我是新手:))

谢谢!

Pab*_*ruz 13

您需要在单独的线程上运行长进程,并且您的方法应该可行.

这不是仅仅longProcessStart Button Click上调用函数,而是创建一个线程,并在其上运行长进程.

发生的事情是你的漫长过程阻塞你的UI线程,它负责处理UI事件.因此,直到完成后才会处理停止按钮单击longProcess().


Im0*_*ity 5

在Delphi中,我们有Application.ProcessMessages(),它基本上处理所有挂起的消息并返回.您可以将此行循环以使UI 更具响应性.

有了这样的功能,你可以做到这一点

while(stop == FALSE) {
     // do something
    ...

    ProcessPendingMessages();
}
Run Code Online (Sandbox Code Playgroud)

编辑:这适用于您不希望将代码拆分为单独的线程 - quick'n'dirty解决方法

  • 在Windows中,它是`GetMessage` /`DispatchMessage` (2认同)