OnShow Event c ++ builder上的ProcessMessages

时间:2016-01-25 16:09:59

标签: c++ message-queue show c++builder c++builder-6

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

RewriteCond %{QUERY_STRING} .*option=com_sobi.* [NC]
RewriteRule ^(.*) http://www.mydomain.de/? [L,R=301]

事件有:

FormShow    

我想知道究竟是什么责任:

Application->ProcessMessages

它究竟做了什么?什么时候用呢?什么时候可以导致exp。?

谢谢!

1 个答案:

答案 0 :(得分:0)

  1. BDS 2006 IDE帮助说明Application->ProcessMessages这个:

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

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

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

    ProcessMessages不允许应用程序进入空闲状态,而HandleMessage则无效。

  2. 那么它是什么?

    如果您的应用阻止了正常的 WindProc 操作(在 VCL 内),它可以回复 Windows消息。例如,如果你对一些需要几分钟的事件进行了一些冗长的计算,那么应用程序就会冻结(无法点击,移动,调整大小,重绘,......直到操作完成)。如果你曾经在那个长循环中调用ProcessMessages(计时器也不会在那段时间内工作),这将允许你的应用程序在此期间响应......所以它不会冻结。

    我通常使用threads or OnIdle event进行此类计算,因此主App不会被阻止。

    我不愿意相信在此类阻止期间调用了OnShow。我会将ProcessMessages置于阻止App的计算中(如果计算在OnShow内,那么它是 OK 否则它将无用。无论如何{{1}只有在您的表单转向OnShow时才会调用},不要将其误认为VisibleOnActivate

  3. 小例子

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

    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的{​​{1}}字段中开始递增整数,并在您点击Caption时停止。在计数期间,应用仍然是响应式的(可以点击,移动,调整大小......)。您需要在关闭之前停止App可能(析构函数等待从所有事件返回)。如果您退出Form1,那么该应用程序将计算但永远不会停止,因为由于冻结您无法点击btStop。要关闭 IDE ,请按 CTRL + F2

  4. 希望它能稍微清除一下。