1

我正在使用 c++ builder (bcb6) 和:

FormShow    

事件有:

Application->ProcessMessages

我想知道具体的责任是什么:

Application->ProcessMessages

它究竟做了什么?我们什么时候可以使用它?什么时候会导致exp.?

谢谢!

4

1 回答 1

0
  1. BDS 2006 IDE 帮助说明了Application->ProcessMessages这一点:

    中断应用程序的执行,以便它可以处理消息队列。

    调用ProcessMessages以允许应用程序处理当前在消息队列中的消息。ProcessMessages循环 Windows 消息循环,直到它为空,然后将控制权返回给应用程序。

    忽略消息处理只影响应用程序调用ProcessMessages,不影响其他应用程序。在冗长的操作中,ProcessMessages定期调用允许应用程序响应绘画和其他消息。

    ProcessMessages不允许应用程序空闲,而允许HandleMessage

  2. 那是为了什么呢?

    如果您的应用程序阻止正常的WindProc操作(在VCL内) ,它允许响应Windows 消息。例如,如果您对某个需要几分钟的事件进行了冗长的计算,则应用程序将冻结(在操作完成之前无法单击、移动、调整大小、重绘......)。如果您从那个长循环中一次调用一次(计时器在那段时间也不会工作),这将允许您的应用程序在这段时间内响应......所以它不会冻结。ProcessMessages

    我通常使用线程或 OnIdle 事件来代替此类计算,因此根本不会阻塞主应用程序。

    我不愿意相信OnShow在这种阻塞期间会调用它。我会将ProcessMessages阻塞应用程序的计算放置在内部(如果计算在内部,OnShow那么它是可以的,否则它将是无用的。无论如何OnShow,只有当你的 Form 转向Visible不要误认为它时才会调用OnActivateor OnPaint

  3. 小例子

    创建空表单应用程序并在其中放置 2 个按钮(btStart,btStop),然后为它们创建点击事件,如下所示:

    //---------------------------------------------------------------------------
    bool go=false;
    //---------------------------------------------------------------------------
    void __fastcall TForm1::btStartClick(TObject *Sender)
        {
        int i=0;
        for (go=true;go;)
            {
            Caption=i; i++;
            Application->ProcessMessages();
            Sleep(100);
            }
        }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::btStopClick(TObject *Sender)
        {
        go=false;
        }
    //---------------------------------------------------------------------------
    

    当您启动应用程序并单击btStart它时,它将开始在Caption字段中增加整数,Form1并在您单击时停止btStop。在计数期间,应用程序仍然响应(可以单击、移动、调整大小...)。您需要在关闭 App 之前停止(析构函数等待从所有事件返回)。如果您退出,则该应用程序将计数但永远不会停止,因为您由于冻结而Application->ProcessMessages();无法点击。btStop要关闭,请单击IDE并按CTRL+F2

希望它可以清除一些东西。

于 2016-01-27T08:57:56.613 回答