您好,请教如果结束一个已经死锁的进程并重新启动它 ?(50分)

  • 主题发起人 主题发起人 pcgod
  • 开始时间 开始时间
P

pcgod

Unregistered / Unconfirmed
GUEST, unregistred user!
您好 ,

有两个程序 A ,B , A 不定时给 B 发送消息(进程间 CopyData 消息) ,B 在将
A 传递的数据处理后回送给 A 处理结果 ;

在运行中发现 B 有时会死掉(没有任何响应) , 关闭后重新启动 B , A 会将刚才B
死锁(可以叫死锁吗 ?) 时没有发出的消息发出但 B 无法接收到 (两个进程的主窗体Memo
可以显示彼此成功接收的消息) ;

我想这样处理可不可以 :

在 A 中 , SendMessage() 后,如果返回不大于0( <= 0 ) 则说明 B 已经死锁,这时
A 结束 B 进程 ,同时经过一个短暂的延时(如 Sleep(1000) )后 A 再重新启动 B 进程

这样可以吗 ? A 可以杀死 已经没有响应的死锁的 B 进程吗 ? 如果可以,应该怎么处理 ?

谢谢, 分不多了,谢谢

 
试试给它发个WM_CLOSE
或者
如果两个程序都是你做的,给B程序加个信号量,每次处理前选判断该量。
(关键不知道B“死锁”时的现象和原因,上述方法也可能没有用)
 
谢谢您的回复,
"给B程序加个信号量,每次处理前选判断该量。"
---- 这应该怎样操作 ?

死锁现象 : 窗体没有反应 ; 也就是说 : B 在最小化时无法再恢复窗体, 结束 B (状态栏
右键点击"关闭") ,会弹出系统提示 : 程序没有响应... ;

原因不知道:),否则也不会有这问题了:)
 
发个WM_CLOSE正常关闭,如果没有响应用TerminateProcess硬来,
就象任务管理那样
 
TerminateProcess() 需要哪些参数 ?

那时程序已经没有响应了还能这样结束吗 ? (不懂,望指导指导)
 
参数是进程ID,可以在对指定的窗口使用GetWindowThreadProcessId得到
function KillProcess(PID: integer): boolean;
var
hProcess: THandle;
begin
hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, PID);
if hProcess <> 0 then
begin
Result := TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
end else Result := False;
end;
 
进程在一次使用中应该有唯一的进程ID,对吗 ? 您的意思是不是 A B 启动后先
取得 B 的进程放在 A 中,如果 A SendMessage() 不成功则用这个ID结束 B ?

GetWindowThreadProcessId() 可不可以在 A 进程中得到 B 进程的ID ? 就像

FindWindow() 的使用 ?

TerminateProcess() 在 B 进程死锁不响应时可不可以完成"杀死" B 的任务 ? 对这个
有点担忧 ...

望指导 , 谢谢

 
关注进程!
 
后退
顶部