单击开始按钮时,函数 RunB() 执行 while 循环。我需要使用停止按钮中途中断 while 循环执行。
switch (msg)
{
case WM_CREATE:
CreateWindow(TEXT("button"), TEXT("Browser"),
WS_VISIBLE | WS_CHILD,
30, 100, 80, 25,
hwnd, (HMENU)1, NULL, NULL);
CreateWindow(TEXT("button"), TEXT("Stop"),
WS_VISIBLE | WS_CHILD,
30, 200, 80, 25,
hwnd, (HMENU)2, NULL, NULL);
break;
case WM_COMMAND:
if (LOWORD(wParam) == 1) {
Obj.RunB();
}
break;
if (LOWORD(wParam) == 2) {
//Code to break the while loop
}
break;
被调用函数 RunB 的代码:
void RunB(){
while(n<15){
//Some statements here:
}
如何使用停止按钮打破 while 循环?
事件驱动的操作(即按下按钮)不应该涉及循环或业务逻辑。否则,整个窗口将暂停,直到获得同步响应。
如果你发现你有一些模态操作需要很长时间才能完成,并且你绝对无法分解它,那么你需要定期处理来自模态操作中的消息。
例如:
while(n<15){
DoAPieceOfWork(n);
FlushPendingMessages();
}
FlushPendingMessages将实现如下:
void FlushPendingMessages(){
MSG msg;
while(PeekMessage(&msg,0,0,0,PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
这将使您的应用程序保持大部分响应。通常,您还会同时显示无模式对话框,以便人们知道您的应用程序很忙并且无法与之交互。
更正确地说,在调用 TranslateMessage/DispatchMessage 之前,您还必须检查WM_QUIT并重新发布它以终止您的应用程序,您还可以显式检查 WM_APP+x 消息 - 使用如下代码:
#define WM_APP_QUITLOOP (WM_APP+1)
// use this from anywhere to tell your processing loop to quit
PostMessage(NULL,WM_APP_QUITLOOP,0,0L);
BOOL FlushPendingMessages(){
MSG msg;
while(PeekMessage(&msg,0,0,0,PM_REMOVE)){
switch(msg.message){
case WM_APP_QUITLOOP:
return FALSE;
case WM_QUIT:
PostQuitMessage(msg.wParam);
return FALSE;
default:
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return TRUE;
}
您的处理循环需要检查 FlushPendingMessages
的返回值,如果它当然为 FALSE,则中止。
编辑:根据@IInspectable的评论。