我创建了一个带有两个按钮的简单窗口, 第一个调用一个持续很长时间的函数, 第二个将变量“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/