我正在使用 c++ builder (bcb6) 和:
FormShow
事件有:
Application->ProcessMessages
我想知道具体的责任是什么:
Application->ProcessMessages
它究竟做了什么?我们什么时候可以使用它?什么时候会导致exp.?
谢谢!
我正在使用 c++ builder (bcb6) 和:
FormShow
事件有:
Application->ProcessMessages
我想知道具体的责任是什么:
Application->ProcessMessages
它究竟做了什么?我们什么时候可以使用它?什么时候会导致exp.?
谢谢!
BDS 2006 IDE 帮助说明了Application->ProcessMessages
这一点:
中断应用程序的执行,以便它可以处理消息队列。
调用ProcessMessages
以允许应用程序处理当前在消息队列中的消息。ProcessMessages
循环 Windows 消息循环,直到它为空,然后将控制权返回给应用程序。
忽略消息处理只影响应用程序调用ProcessMessages
,不影响其他应用程序。在冗长的操作中,ProcessMessages
定期调用允许应用程序响应绘画和其他消息。
ProcessMessages
不允许应用程序空闲,而允许HandleMessage
。
那是为了什么呢?
如果您的应用程序阻止正常的WindProc操作(在VCL内) ,它允许响应Windows 消息。例如,如果您对某个需要几分钟的事件进行了冗长的计算,则应用程序将冻结(在操作完成之前无法单击、移动、调整大小、重绘......)。如果您从那个长循环中一次调用一次(计时器在那段时间也不会工作),这将允许您的应用程序在这段时间内响应......所以它不会冻结。ProcessMessages
我通常使用线程或 OnIdle 事件来代替此类计算,因此根本不会阻塞主应用程序。
我不愿意相信OnShow
在这种阻塞期间会调用它。我会将ProcessMessages
阻塞应用程序的计算放置在内部(如果计算在内部,OnShow
那么它是可以的,否则它将是无用的。无论如何OnShow
,只有当你的 Form 转向Visible
不要误认为它时才会调用OnActivate
or OnPaint
。
小例子
创建空表单应用程序并在其中放置 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。
希望它可以清除一些东西。