注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

银河军团大本营

光荣的军团,永远的丰碑 <坚持原创>

 
 
 

日志

 
 

如何判断程序已经完全退出?  

2012-08-29 12:59:48|  分类: 编程小技巧 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  在给应用程序发送WM_CLOSE消息后,往往需要等待它完全结束再继续运行,等待结束可以用WaitForSingleObject,在执行WaitForSingleObject后可能还需要再判断一下程序是否已经完全退出,一般的方法是判断进程是否存在。不过,在实际使用过程中我发现在WaitForSingleObject之后立即检查进程ID,可能检查结果是进程仍然还在,但其实此时已经可以替换或重启动程序了。

    经过试验,发现可以用IsWindow来判断程序的主窗口是否已经释放,只要主窗口的Handle已经失效,那么就可以认为程序已经完全退出了。具体代码片断如下(最新测试表明,用IsWindow及ProcessExist判断也不能保证100%准确,晕……):

var
mainHandle: THandle;
pid: DWord;
hProc: THandle;
begin
//...

GetWindowThreadProcessId(mainHandle, @pid);
SendMessage(mainHandle, WM_CLOSE, 0, 0);
hProc := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
if hProc <> 0 then try
WaitForSingleObject(hProc, 60*1000); //60*1000这个参数可根据试验情况加以调整,用INFINITE会不会导致一直等待?唉,没有万能药啊^o^
finally
CloseHandle(hProc);
end;
if IsWindow(mainHandle) and ProcessExist(pid) then begin
//程序未能完全退出,报错或做进一步处理
end;

//...
end;

  ProcessExist的代码如下:

function ProcessExist(pid: Cardinal): Boolean;
var
hProc: THandle;
begin
hProc := OpenProcess(PROCESS_ALL_ACCESS, False, pId);
Result := hProc <> 0;
CloseHandle(hProc);
end;

  评论这张
 
阅读(987)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018