try一下,啥异常看看不就知道了用timer时注意,主线程操作时间超过了timer间隔时间时,则timer事件将被延后执行!
如主线程暂停30秒,则实际你的timer也会被延时30秒!
如主线程暂停30秒,则实际你的timer也会被延时30秒!
解决方案 »
- 小妹请教一个File.Copy奇怪的问题。
- webform中treeview的用法,selectnode.text总是第一个结点的值
- 图片显示功能 (可加100分)
- 如何获取checkedlistbox ValueMember的值啊 代码如下
- 关于 MouseMove 的处理问题,急~~~ 请各位指点
- 谁给解释下下边的语句什么意思
- c#数据库连接的问题
- 请问大家这个水晶报表的格式应该怎么做?(内有图)
- 界面控件消失
- control.parent在vb.net中是什么?
- 如何编写.net客户端请求java xfire实现的web service
- splitContainer与treeview的使用
{
int milliStart = Environment.TickCount;
while (True)
{
int milliEnd = Environment.TickCount;
if (milliEnd - milliStart > 15000) // 15秒执行一次
{
// Do ...
milliStart = Environment.TickCount; // 都执行完了重新开始计算
}
}
}如果你的每隔15秒是指包括处理时间的话void AThread()
{
int milliStart = Environment.TickCount;
while (True)
{
int milliEnd = Environment.TickCount;
if (milliEnd - milliStart > 15000) // 15秒执行一次
{
// Do ...
milliStart = milliEnd; // 如果上面的操作时间已经超过了15秒,
// 意味着下一次循环判断milliEnd - milliStart的时候会立即成立而运行下一次操作了
}
}
}
你的主窗口的线程!我一看到while (True)代码就看不下去了...心晃
这TIMER好像有这么个bug 时间长了就完蛋换个timer
用System.Timers.Timer
我哪本书看过,windows会在当消息队列里有4个还是几个WM_TIME时丢掉最早的WM_TIME以防止消息队列堵塞,因为系统也会产生很多计时消息,
如果你的程序总是不能在15秒内完成运算或者电脑运行缓慢或病毒什么的,结果使得队列里排队的WM_TIME越来越多,然后最早的老被丢掉,
最后的情况就是每次的第一个WM_TIME总是在被捕获前就被丢弃而后面继续在生成WM_TIME,因为你上次的操作没有完成,也就没机会运行到禁止计时器哪行代码但下次的时间又到了!,所以不是计时器的bug,是windows就是这么设计的
这篇论坛就讨论了这个问题,引用一下
问题: 困惑,WM_TIMER消息的处理是阻塞的吗? ( 积分: 100 )
分类: 系统相关
来自: g_feng, 时间: 2005-09-18 17:22:00, ID: 3209597
查了一些以前的帖子,最后的结论似乎都是WM_TIMER是阻塞的,因为它是基于窗口进程的,并没有多线程的处理。我自己也写了一个测试程序证明的确没有多线程。但有一个现象自己一直想不通,按道理模式对话框应该阻塞的,但是我在一个定时器的处理函数里弹出一个模式对话框它应该会阻塞住,那么当进程在这个函数没有处理完时,不应该再继续下面的处理,这样下一个定时器消息也不应该会处理,但情况是对话框会不断弹出,请问这应该怎么解释????来自: g_feng, 时间: 2005-09-18 18:02:35, ID: 3209614
刚才查到一个关于这个问题的答案:
如果你是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做你就要写很多这些东西了!来自: billwillman, 时间: 2005-09-18 19:30:35, ID: 3209674
WM_TIME消息为较弱的消息处理当操作系统比较忙的时候会丢弃消息队列中的WM_TIME消息,
WM_PAINT消息也一样
好象是TIMER有问题,好象和垃圾回收机制也有关系吧,自己猜测,具体的不清楚……
楼主可以试下用线程来搞,或者把一些变量设置成static
可能会有效果