关于SendMessage和PostMessage,近4个月的困惑
原以为很简单的问题,花了近4个月的时间,一直没能很好地解决,纠结ing
据说SendMessage是发消息并等待消息的处理结果,然后再执行一下句;
PostMessage是把消息放到消息队列里就返回继续执行下一句。
实际上,经过多次试验,向别的程序发送消息,不管是::SendMessage还是::PostMessage,后面不跟一个Sleep(n)或者别的延时,都可能返回0,下一句得以继续执行,而此时目标程序可能接到了消息,也可能没接到;只有n足够大的时候,才能保证目标程序正确收到消息。
也就是说,向目标程序的特定文本框发送一个字符串,标准方式是:
for i := 0 to Length(cStr)-1 do
begin
PostMessage(hCtrlHandle,WM_CHAR,Wparam(cStr[i]),1);
Sleep(iDelay);
Application.ProcessMessages;
end;
或者:
SendMessage(hCtrlHandle,WM_SETTEXT,0,sStr);
Sleep(iDelay);
好吧,这样也挺不错的。问题是,iDelay 应该取多少呢?
iDelay<=600的时候,我的程序在T4400双核CPU、2G内存的本本上运行得很好,但放到1.5G单核CPU、1G内存的台式机上,发送消息就经常失败了:(
如何才能根据CPU的主频自动计算出延时值iDelay,既保证消息发送成功,又尽量避免多余的延时时间?