c++ - 如何使用 "Stop Button"停止进程

标签 c++ c winapi

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

我的意图是,通过按下第一个按钮,它会运行一个漫长的过程, 控制是否将每个循环的停止变量设置为 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;

    ...

}

问题是,当我按下第一个按钮时,进程正常启动, 但是当我按下第二个按钮以停止该过程时,什么也没有发生, 我注意到停止变量仅在进程结束后才设置为 TRUE。 我认为可能是与消息队列相关的问题......

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

谢谢!

最佳答案

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

这不是仅仅在 单击开始按钮 时调用 longProcess 函数,而是创建一个线程,然后在其上运行长进程。

发生的情况是您的长进程阻塞了负责处理 UI 事件的 UI 线程。因此,在 longProcess() 完成之前,不会处理停止按钮单击

关于c++ - 如何使用 "Stop Button"停止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3414696/

相关文章:

c++ - 遍历二维数组的所有子数组

c++ - C++ 中具有指向成员的指针的结构,如何访问它

c++ - 针对给定问题的优化算法?

Python矩阵乘法索引交换内存使用示例

c++ - 在针对64位变量的文字整数上使用NOT(〜)运算符时是否需要类型转换

winapi - 抑制 WM_ERASEBKGND 的正确方法是什么?

c++ - Win32 C++ : Display contents of a listbox

c++ - 为什么 int[] 被视为右值?

c - union 内的 union

c++ - 无限循环中的 Windows 消息泵