查了一些以前的帖子,最后的结论似乎都是WM_TIMER是阻塞的,因为它是基于窗口进程的,并没有多线程的处理。我自己也写了一个测试程序证明的确没有多线程。但有一个现象自己一直想不通,按道理模式对话框应该阻塞的,但是我在一个定时器的处理函数里弹出一个模式对话框它应该会阻塞住,那么当进程在这个函数没有处理完时,不应该再继续下面的处理,这样下一个定时器消息也不应该会处理,但情况是对话框会不断弹出,请问这应该怎么解释????
解决方案 »
- 如何把image1.picture赋值给variant变量
- 求附书源码
- Delphi 2006年8月 专家排行榜
- 这是什么编码?(UP有分)
- 求一个方法?问题是这样的。在局域网里 有10个人录入信息到我的服务器里面(也就是access数据库)服务器的工作就是接收他们时时录入的信
- 【高分醒目】高分征求软件名字
- 请问delphi里的compile和build有什么区别啊,都能产生可执行文件?
- 有谁用过D7里的TcpServer和Tcpclient做过通讯程序的请帮忙
- $delphi数据库编程联盟启示$
- 谁能够解释我的问题
- 初学者,请各位高手看看这代码有什么错误?
- 请用Delphi写一个函数对数组变量ArrMdChip进行排序(要求:排序算法不限,但效率优先)。谢谢!!
如果你是DoModal或者Create一个对话框或者其它有消息循环和响应的东东那你在消息队列里的消息就会被取出并且得到处理(GetMessage,TranslateMessage,DispatchMessage)
所以你的TIMER消息不会被阻挡
但是如果你在TIMER消息里是大量长时间的计算那你的消息就阻塞了,如果你用SLEEP试试就知道了,反过来说,如果你在这个长时间的计算中间用
BOOL bRet;
if( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
这个,那么你的TIMER消息可能也会发生
关键在GetMessage其实你不用MFC你用WIN32做你就要写很多这些东西了!
.....
Form1.ShowModal;...
...
Timer1.Enable := true;