社区
C#
帖子详情
winform程序长时间运行挂掉了
aa37742698
2009-04-01 02:47:04
我有个winform程序 15秒就获取一下网页数据 ,基本上运行10几个小时都不是问题 但时间长了 程序就不执行15秒后的事件,相当于timer控件失效 日志也没报错 程序显示最后一次执行获取的数据 想问下 这是timer空间文件还是内存? timer控件执行时间前我吧他禁用,执行后开启,应该没什么问题
...全文
609
17
打赏
收藏
winform程序长时间运行挂掉了
我有个winform程序 15秒就获取一下网页数据 ,基本上运行10几个小时都不是问题 但时间长了 程序就不执行15秒后的事件,相当于timer控件失效 日志也没报错 程序显示最后一次执行获取的数据 想问下 这是timer空间文件还是内存? timer控件执行时间前我吧他禁用,执行后开启,应该没什么问题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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这种系统用死循环的线程模拟定时器
我一个实时系统线程都已经连续跑了几个月了
从新手小白进入
WinForm
编程 (VS2019)
WinForm
框架 是 Windows Form 的简称,是美国微软公司Microsoft开发基于 .NET Framework 平台的桌面运用
程序
框架,一般使用 C#语言 编写。
WinForm
框架可用于设计窗体和可视控件,采用面向对象语言C#,可快速创建绚丽漂亮的基于Windows的桌面应用
程序
,提供丰富的控件与第三方开源组件,依靠.Net平台的成熟生态,让开发者可以高效快速的开发企业级项目!本课程是黄老师的 .Net平台开发系列课程之一,通过
WinForm
框架控件与精炼知识点的梳理与细致讲解,结合代码实战演练,帮助学员迅速掌握
WinForm
开发,达到企业级
WinForm
开发的水平!
WINFORM
因为 线程崩溃
1、如果
WinForm
程序
中使用了线程,而线程调用的代码中会抛出异常,该异常没有任何Try块处理。就会导致
程序
从主线程中跳出,导致
WinForm
程序
突然崩溃性关闭。2、
程序
读写某些外部资源,比如数据库、串口、并口、网络等。当这些资源发生堵塞或者出现问题,有可能会导致
WinForm
程序
长时间
处于等待状态,
程序
就会类似于死机现象。3、写
程序
的时候,
程序
出现逻辑错误,导致死循环,或者线程死锁。如果该
程序
...
C# 建数sqlserver据库
程序
用
winform
运行
SQL脚本创建数据库
需要用到2个引用: using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; 路径大概是:C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies 只要安装了SQL2008就行,具体百度。 http://do...
WinForm
多线程学习文档
基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联
WinForm
多线程编程篇 我的多线程
WinForm
程序
老是抛出InvalidOperationException ,怎么解决? Invoke,BeginInv...
转:
WINFORM
多线程编程
把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论 目录 基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联
WinForm
多线程编程篇 ...
C#
110,538
社区成员
642,577
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章