winform程序长时间运行挂掉了

aa37742698 2009-04-01 02:47:04
我有个winform程序 15秒就获取一下网页数据 ,基本上运行10几个小时都不是问题 但时间长了 程序就不执行15秒后的事件,相当于timer控件失效 日志也没报错 程序显示最后一次执行获取的数据 想问下 这是timer空间文件还是内存? timer控件执行时间前我吧他禁用,执行后开启,应该没什么问题
...全文
609 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wartim 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xiaolukatie 的回复:]
以前在2003下碰过类似问题,那时候写的是windows服务,也是运行一段时间后莫名其妙的停了或者不按照时间执行了
好象是TIMER有问题,好象和垃圾回收机制也有关系吧,自己猜测,具体的不清楚……
楼主可以试下用线程来搞,或者把一些变量设置成static
可能会有效果
[/Quote]


在windows服务里不能用拖控件后自动生成的那个timer
xiaolukatie 2009-04-01
  • 打赏
  • 举报
回复
以前在2003下碰过类似问题,那时候写的是windows服务,也是运行一段时间后莫名其妙的停了或者不按照时间执行了
好象是TIMER有问题,好象和垃圾回收机制也有关系吧,自己猜测,具体的不清楚……
楼主可以试下用线程来搞,或者把一些变量设置成static
可能会有效果
wartim 2009-04-01
  • 打赏
  • 举报
回复
http://it.inhe.net/richbbs/2005/320/3209597.htm
这篇论坛就讨论了这个问题,引用一下


问题: 困惑,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消息也一样

yang_road 2009-04-01
  • 打赏
  • 举报
回复
最好把关键代码贴上来看看。
wartim 2009-04-01
  • 打赏
  • 举报
回复
那可能是你的计时器消息被吃掉了,还是用我说的线程循环定时吧
我哪本书看过,windows会在当消息队列里有4个还是几个WM_TIME时丢掉最早的WM_TIME以防止消息队列堵塞,因为系统也会产生很多计时消息,
如果你的程序总是不能在15秒内完成运算或者电脑运行缓慢或病毒什么的,结果使得队列里排队的WM_TIME越来越多,然后最早的老被丢掉,
最后的情况就是每次的第一个WM_TIME总是在被捕获前就被丢弃而后面继续在生成WM_TIME,因为你上次的操作没有完成,也就没机会运行到禁止计时器哪行代码但下次的时间又到了!,所以不是计时器的bug,是windows就是这么设计的
cancerser 2009-04-01
  • 打赏
  • 举报
回复
还有就是 多考虑些情况 15秒内 一定要执行完,否则..你明白的
cancerser 2009-04-01
  • 打赏
  • 举报
回复
用的是 FROM的那个TIMER吧. vs2005?
这TIMER好像有这么个bug 时间长了就完蛋

换个timer
用System.Timers.Timer
jishengzu 2009-04-01
  • 打赏
  • 举报
回复
以前我也写了个类似的东西。
用定时器去执行某段代码,但时间一长好像就不运行那代码了。(当然有一些不定的因素。)
导致代码不运行。

当时是这样解决的,定了一个全局变量。
在运行指定代码是变量清0;
每次运行定时控件时变量+1
还要在定时控件中判断当变量=10时重启系统。

以前就是怎么解决的。(读取网络数据不稳定。应为网络问题而拿不到值,而定时控件要不管又没那到值都运行,导致关键代码不运行,我就是这种情况)
kkun_3yue3 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aa37742698 的回复:]
没任何异常  也没用到线程
[/Quote]

你的主窗口的线程!

我一看到while (True)代码就看不下去了...心晃

aa37742698 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wartim 的回复:]
看你的设计意图了

如果你的每隔15秒是指不包括处理时间的话

void AThread()
{
int milliStart = Environment.TickCount;
while (True)
{
int milliEnd = Environment.TickCount;
if (milliEnd - milliStart > 15000) // 15秒执行一次
{
// Do ...
milliStart = Environment.TickCount; // 都执行完了重新开始计算
}
}

[/Quote]


我已经判断过了 15秒不包括获取时间 获取前TIMER禁用 获取完启用
wartim 2009-04-01
  • 打赏
  • 举报
回复
看你的设计意图了

如果你的每隔15秒是指不包括处理时间的话

void AThread()
{
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的时候会立即成立而运行下一次操作了
}
}
}
aa37742698 2009-04-01
  • 打赏
  • 举报
回复
没任何异常 也没用到线程
kkun_3yue3 2009-04-01
  • 打赏
  • 举报
回复
try一下,啥异常看看不就知道了

用timer时注意,主线程操作时间超过了timer间隔时间时,则timer事件将被延后执行!
如主线程暂停30秒,则实际你的timer也会被延时30秒!
aa37742698 2009-04-01
  • 打赏
  • 举报
回复
程序应该没问题的 挂掉后 我重新运行就可以
aa37742698 2009-04-01
  • 打赏
  • 举报
回复
死循环的线程? 能说具体点吗 或者贴上代码 谢谢
zgke 2009-04-01
  • 打赏
  • 举报
回复
没遇到过..应该是你程序的问题.
wartim 2009-04-01
  • 打赏
  • 举报
回复
应该是你程序本身的问题,建议lz这种系统用死循环的线程模拟定时器
我一个实时系统线程都已经连续跑了几个月了

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧