在被调用的函数中打破while循环

时间:2016-07-07 10:00:59

标签: c++ winapi visual-c++

单击开始按钮时,函数RunB()执行while循环。我需要使用Stop Button中途执行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循环?

2 个答案:

答案 0 :(得分:1)

事件驱动的操作(即按下按钮)不应该使用循环或业务逻辑....否则整个窗口将停止,直到它获得同步响应。

答案 1 :(得分:1)

如果您发现某些模态操作需要很长时间才能完成而且您绝对无法将其分解,那么您需要定期处理模态操作中的消息。

例如:

while(n<15){
  DoAPieceOfWork(n);
  FlushPendingMessages();
}

FlushPendingMessages将实现类似:

void FlushPendingMessages(){
  MSG msg;
  while(PeekMessage(&msg,0,0,0,PM_REMOVE)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
}

这将使您的应用程序保持最佳响应。 Normaly你也会同时显示一个无模式对话框,这样人们就知道你的应用程序很忙,无法与之交互。

更正确一点,在调用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的评论。