中断调用函数中的 while 循环



单击开始按钮时,函数 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的评论。

最新更新