我正在使用c ++ builder(bcb6)和on:
RewriteCond %{QUERY_STRING} .*option=com_sobi.* [NC]
RewriteRule ^(.*) http://www.mydomain.de/? [L,R=301]
事件有:
FormShow
我想知道究竟是什么责任:
Application->ProcessMessages
它究竟做了什么?什么时候用呢?什么时候可以导致exp。?
谢谢!
答案 0 :(得分:0)
BDS 2006 IDE帮助说明Application->ProcessMessages
这个:
中断应用程序的执行,以便它可以处理消息队列。
调用ProcessMessages
以允许应用程序处理当前在消息队列中的消息。 ProcessMessages
循环Windows消息循环,直到它为空,然后将控制权返回给应用程序。
忽略消息处理仅影响调用ProcessMessages
的应用程序,而不影响其他应用程序。在冗长的操作中,定期调用ProcessMessages
允许应用程序响应绘制和其他消息。
ProcessMessages
不允许应用程序进入空闲状态,而HandleMessage
则无效。
那么它是什么?
如果您的应用阻止了正常的 WindProc 操作(在 VCL 内),它可以回复 Windows消息。例如,如果你对一些需要几分钟的事件进行了一些冗长的计算,那么应用程序就会冻结(无法点击,移动,调整大小,重绘,......直到操作完成)。如果你曾经在那个长循环中调用ProcessMessages
(计时器也不会在那段时间内工作),这将允许你的应用程序在此期间响应......所以它不会冻结。
我通常使用threads or OnIdle event进行此类计算,因此主App不会被阻止。
我不愿意相信在此类阻止期间调用了OnShow
。我会将ProcessMessages
置于阻止App的计算中(如果计算在OnShow
内,那么它是 OK 否则它将无用。无论如何{{1}只有在您的表单转向OnShow
时才会调用},不要将其误认为Visible
或OnActivate
。
小例子
创建空表单应用并在其中放置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 。
希望它能稍微清除一下。