程序假死的判断?

ac_de 2010-07-25 06:35:57
我做了一个监视程序B,定时巡检进程,判断主程序A是否异常退出,如果退出了则重新起来。
但是如果主程序A因为某种条件死机或者弹出错误对话框,则如何判断,谢谢?
...全文
437 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ponydph 2010-07-27
[Quote=引用 13 楼 xianglitian 的回复:]
引用楼主 ac_de 的回复:
我做了一个监视程序B,定时巡检进程,判断主程序A是否异常退出,如果退出了则重新起来。
但是如果主程序A因为某种条件死机或者弹出错误对话框,则如何判断,谢谢?

我说的是这个窗口
[/Quote]

是否指的 系统报错的异常窗口??
  • 打赏
  • 举报
回复
Eleven 2010-07-27
[Quote=引用楼主 ac_de 的回复:]
我做了一个监视程序B,定时巡检进程,判断主程序A是否异常退出,如果退出了则重新起来。
但是如果主程序A因为某种条件死机或者弹出错误对话框,则如何判断,谢谢?
[/Quote]
A和B两个进程通讯,发送数据,类似网络通讯中的心跳包来检测对方是否存活。。。
  • 打赏
  • 举报
回复
向立天 2010-07-27
[Quote=引用楼主 ac_de 的回复:]
我做了一个监视程序B,定时巡检进程,判断主程序A是否异常退出,如果退出了则重新起来。
但是如果主程序A因为某种条件死机或者弹出错误对话框,则如何判断,谢谢?
[/Quote]
我说的是这个窗口
  • 打赏
  • 举报
回复
RamonJin 2010-07-26
两个进程用TCP连一下就可以了。TCP一断开,就是程序挂了。再不行发个心跳也可以。
  • 打赏
  • 举报
回复
ac_de 2010-07-26
[Quote=引用 11 楼 xianglitian 的回复:]
引用 9 楼 ac_de 的回复:
引用 7 楼 xianglitian 的回复:
对于异常对话框
我都是通过钩这个窗口创建的消息来判断
然后做相应处理


谢谢,请问
请问如何判断 这个窗口的创建消息????

用钩子钩啊
钩HCBT_CREATEWND
[/Quote]


如何区分 正常创建的窗口 和异常产生的窗口 谢谢
  • 打赏
  • 举报
回复
向立天 2010-07-26
[Quote=引用 9 楼 ac_de 的回复:]
引用 7 楼 xianglitian 的回复:
对于异常对话框
我都是通过钩这个窗口创建的消息来判断
然后做相应处理


谢谢,请问
请问如何判断 这个窗口的创建消息????
[/Quote]
用钩子钩啊
钩HCBT_CREATEWND
  • 打赏
  • 举报
回复
austin_minny 2010-07-26
同意TCP连接判断的办法
  • 打赏
  • 举报
回复
ac_de 2010-07-26
[Quote=引用 7 楼 xianglitian 的回复:]
对于异常对话框
我都是通过钩这个窗口创建的消息来判断
然后做相应处理
[/Quote]

谢谢,请问
请问如何判断 这个窗口的创建消息????
  • 打赏
  • 举报
回复
queen25 2010-07-26
友情支持
  • 打赏
  • 举报
回复
向立天 2010-07-26
对于异常对话框
我都是通过钩这个窗口创建的消息来判断
然后做相应处理
  • 打赏
  • 举报
回复
ac_de 2010-07-26
分不多了不好意思,如果可行的话 一定重重感谢!
-----------------------------------------
程序出现异常后,windows会立即弹出一个 对话框,提示‘XX程序出现异常,需要关闭’,
如果没有人点击,则会一直存在,由于是模式对话框,会阻碍程序其它功能运行,
最后的办法,是发现不运行后,强行杀掉主线程再重启!

用定时器最担心 程序由于cpu等 或者界面不刷新等 阻碍消息发送!
  • 打赏
  • 举报
回复
Liberty-Bird 2010-07-25
楼主,这种问题比较难回答,你怎么只给20分啊!应该给100分!像迅雷那样的软件,也有自己挂掉的时候,它就没有自动重启功能,搞得用户很郁闷——半夜开机无人下载,结果迅雷挂了,我就死命地骂迅雷软件做的真S B,为啥不能自动重启呢!就用我的这种定时器方式来监视程序,一定会解决任何异常问题。
  • 打赏
  • 举报
回复
Liberty-Bird 2010-07-25
可行是可行,但是不太好,各位想过用定时器吗?
int g_nState(0);
SetTimer(1,5000,NULL);//5秒循环一次
OnTimer(UINT nIDEvent)
{
if(nIDEvent==1)
{
将g_nState值存入某文件A中;
if(g_nState++>1000)
g_nState=0;
}
CDialog::OnTimer();
}

在监视程序中也创建一个定时器:
SetTimer(1,8000,NULL);//8秒循环一次
int g_nStateLast=-1;
OnTimer(UINT nIDEvent)
{
if(nIDEvent==1)
{
int nState;
从文件A中读取状态值nState;
if(nState==g_nStateLast)
{
重启被监视程序;
g_nStateLast=-1;
}
else g_nStateLast=nState;
if(g_nState++>1000)
g_nState=0;
}
CDialog::OnTimer();
}

这样不论什么情况下,只要你的主程序出了问题,定时器线程也必定会自动中断,g_nState的值(文件A的内容)不会再改变,监视程序经过2次读取A文件中g_nState的值,再与g_nStateLast相比较,如果二者相等说明主程序已经死机,应当重启;否则就将新读取到的g_nState值赋给g_nStateLast保存起来,以备下次比较。
当然这样比较占用系统资源,两个定时器不停地工作,最好将定时间隔根据实际需要定长一些。
我的办法虽然很笨,但绝对可以应付任何主程序异常死机的情况,前提是你的监视程序一定要简单,做到绝对不会自己挂掉。
  • 打赏
  • 举报
回复
楼上说的可行啊
  • 打赏
  • 举报
回复
_Kwekwe_ 2010-07-25
可以参考Windows判断假死的方法:
发送空消息给主程序的主窗口,超过5秒钟没有响应该消息的话,认为就已经死掉了————当然啦,如果主程序中可能有超过5秒钟的长任务,就会出现假死——外界没法判断是出现死循环还是假死了。

这个时候还可以判断主程序A的CPU占用,如果是0的话,可能是因为等待某个资源死掉了;如果是或者接近50%或者100%的话,就可能陷入长任务或者死循环了。
  • 打赏
  • 举报
回复
发帖
VC/MFC

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2010-07-25 06:35
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……