我正在使用 c++ builder (bcb6) 和 on:
FormShow
事件有:
Application->ProcessMessages
我想知 Prop 体责任是什么:
Application->ProcessMessages
它到底做了什么?我们什么时候用那个?什么时候会导致exp.?
谢谢!
最佳答案
BDS 2006 IDE 帮助说明
Application->ProcessMessages
是这样的:中断应用程序的执行,以便它可以处理消息队列。
调用
ProcessMessages
以允许应用程序处理当前在消息队列中的消息。ProcessMessages
循环 Windows 消息循环直到它为空,然后将控制权返回给应用程序。忽略消息处理只会影响调用
ProcessMessages
的应用程序,不会影响其他应用程序。在冗长的操作中,定期调用ProcessMessages
允许应用程序响应绘制和其他消息。ProcessMessages
不允许应用程序空闲,而HandleMessage
允许。那是为了什么?
如果您的应用阻止正常的 WindProc 操作(在 VCL 内),它允许响应 Windows 消息。例如,如果您对某些需要几分钟的事件进行了冗长的计算,应用程序将卡住(无法单击、移动、调整大小、重绘……直到操作完成)。如果您偶尔从那个长循环中调用
ProcessMessages
(计时器在此期间也不会工作),这将使您的应用程序在此期间响应......所以它不会卡住。我通常使用threads or OnIdle event而不是进行此类计算,因此根本不会阻止主应用程序。
我不愿意相信
OnShow
在这种阻塞期间被调用。我会将ProcessMessages
放在阻止应用程序的计算中(如果计算在OnShow
中,那么它是 OK 否则它将毫无用处无论如何,OnShow
仅在您的表单变为Visible
时才被调用,不要将其误认为是OnActivate
或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
时,它将开始递增Form1
的Caption
字段中的整数,并在您单击时停止bt停止
。在计数期间应用程序仍然响应(可以单击、移动、调整大小...)。您需要在关闭 App 之前停止(析构函数等待从所有事件返回)。如果您移除Application->ProcessMessages();
则应用程序将计数但永远不会停止,因为由于卡住您无法单击btStop
。要关闭,请单击 IDE 并按 CTRL+F2。
希望它能把事情弄清楚一些。
关于c++ - OnShow 事件上的 ProcessMessages c++ builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997097/