我正在使用c ++ builder(bcb6)以及以下版本:

FormShow


事件有:

Application->ProcessMessages


我想知道确切的责任:

Application->ProcessMessages


它到底做了什么?以及何时使用该功能?什么时候会引起爆炸?

谢谢!

最佳答案

BDS 2006 IDE帮助声明了以下Application->ProcessMessages

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

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

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

ProcessMessages不允许应用程序进入空闲状态,而HandleMessage允许。
那是什么呢?

如果您的应用阻止了正常的WindProc操作(在VCL内部),它可以响应Windows消息。例如,如果您花了几分钟进行某些事件的长时间计算,则应用程序将冻结(无法单击,移动,调整大小,重新绘制...,直到完成操作)。如果您从该长循环中一次调用ProcessMessages(在这段时间内定时器也将不起作用),这将使您的应用在此期间能够响应...从而不会冻结。

我通常使用threads or OnIdle event代替此类计算,因此主应用程序完全不会被阻止。

我不愿意在这种阻止期间调用OnShow。我将ProcessMessages放置在阻止App的计算中(如果计算位于OnShow之内,则可以,否则将没有用。无论如何,仅当您的表格转向OnShow时才调用Visible不要将其误认为OnActivateOnPaint
小例子

创建一个空窗体应用程序,并在其中放置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时,它将开始在CaptionForm1字段中递增整数,并在单击btStop时停止。在计数过程中,应用程序仍会响应(可以单击,移动,调整大小...)。您需要先停止,然后才能关闭App(析构函数等待所有事件返回)。如果您取消Application->ProcessMessages();,则该应用将计数,但将永远不会停止,因为由于冻结而无法单击btStop。要关闭,请单击IDE并按CTRL + F2。


希望它能清除一些东西。

关于c++ - OnShow Event C++构建器上的ProcessMessages,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34997097/

10-09 13:22