我创建了一个带有两个按钮的简单窗口,第一个调用一个持续很长时间的函数,第二个调用变量"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
您需要在单独的线程上运行长进程,并且您的方法应该可行.
这不是仅仅longProcess
在Start Button Click上调用函数,而是创建一个线程,并在其上运行长进程.
发生的事情是你的漫长过程阻塞你的UI线程,它负责处理UI事件.因此,直到完成后才会处理停止按钮单击longProcess()
.
在Delphi中,我们有Application.ProcessMessages(),它基本上处理所有挂起的消息并返回.您可以将此行循环以使UI 更具响应性.
有了这样的功能,你可以做到这一点
while(stop == FALSE) {
// do something
...
ProcessPendingMessages();
}
Run Code Online (Sandbox Code Playgroud)
编辑:这适用于您不希望将代码拆分为单独的线程 - quick'n'dirty解决方法
归档时间: |
|
查看次数: |
1865 次 |
最近记录: |