Inno setup 在Inno设置中,EWAitUntilidle的精确定义是什么?
作为安装程序的一部分,我需要调用DBMS系统并关闭它,然后再启动它。如果DBMS由于某种原因挂起,我的安装程序将永远挂起。我调用Exec命令来启动或停止数据库,我的问题是:Inno setup 在Inno设置中,EWAitUntilidle的精确定义是什么?,inno-setup,Inno Setup,作为安装程序的一部分,我需要调用DBMS系统并关闭它,然后再启动它。如果DBMS由于某种原因挂起,我的安装程序将永远挂起。我调用Exec命令来启动或停止数据库,我的问题是: ewWaitUntilIdle的确切定义是什么?如果我的启动/停止数据库的命令再也没有返回,那么什么满足空闲条件?这是Inno的源代码: procedure HandleProcessWait(ProcessHandle: THandle; const Wait: TExecWait; const ProcessMess
ewWaitUntilIdle的确切定义是什么?如果我的启动/停止数据库的命令再也没有返回,那么什么满足空闲条件?这是Inno的源代码:
procedure HandleProcessWait(ProcessHandle: THandle; const Wait: TExecWait;
const ProcessMessagesProc: TProcedure; var ResultCode: Integer);
begin
try
if Wait = ewWaitUntilIdle then begin
repeat
ProcessMessagesProc;
until WaitForInputIdle(ProcessHandle, 50) <> WAIT_TIMEOUT;
end;
if Wait = ewWaitUntilTerminated then begin
{ Wait until the process returns, but still process any messages that
arrive. }
repeat
{ Process any pending messages first because MsgWaitForMultipleObjects
(called below) only returns when *new* messages arrive }
ProcessMessagesProc;
until MsgWaitForMultipleObjects(1, ProcessHandle, False, INFINITE, QS_ALLINPUT) <> WAIT_OBJECT_0+1;
{ Process messages once more in case MsgWaitForMultipleObjects saw the
process terminate and new messages arrive simultaneously. (Can't leave
unprocessed messages waiting, or a subsequent call to WaitMessage
won't see them.) }
ProcessMessagesProc;
end;
{ Get the exit code. Will be set to STILL_ACTIVE if not yet available }
if not GetExitCodeProcess(ProcessHandle, DWORD(ResultCode)) then
ResultCode := -1; { just in case }
finally
CloseHandle(ProcessHandle);
end;
end;
过程HandleProcessWait(ProcessHandle:THandle;const Wait:TExecWait;
const ProcessMessagesProc:TProcedure;var ResultCode:Integer);
开始
尝试
如果Wait=ewwaituntille,则开始
重复
进程消息存储过程;
直到WaitForInputdle(ProcessHandle,50)等待超时;
结束;
如果Wait=EWwaitUnterminated,则开始
{等待进程返回,但仍会处理
到达。}
重复
{首先处理任何挂起的消息,因为MsgWaitForMultipleObjects
(以下调用)仅在*新*消息到达时返回}
进程消息存储过程;
直到MsgWaitForMultipleObjects(1,ProcessHandle,False,INFINITE,QS_ALLINPUT)等待\u OBJECT_0+1;
{如果MsgWaitForMultipleObjects看到
进程终止,新消息同时到达。(无法离开)
未处理的消息正在等待,或后续调用WaitMessage
我看不见他们
进程消息存储过程;
结束;
{获取退出代码。如果还不可用,将设置为仍然处于活动状态}
如果不是GetExitCodeProcess(ProcessHandle,DWORD(ResultCode)),则
结果代码:=-1;{以防万一}
最后
关闭手柄(ProcessHandle);
结束;
结束;
如您所见,EWAitUntille只使用了WaitForInputle函数-请参阅此处的详细信息:windows installer标记用于基于MSI的windows installer。不要误用它。我假设您正在执行
net start
等。不要这样做,请使用WinAPI服务控制函数。然后,您可以更好地控制等待服务响应的时间,然后再放弃并决定如何从中恢复(例如,显示错误)。如果OP的进程冻结,您会怎么做(我们可以称之为冻结,因为启动时让进程空闲不会花费很长时间)?我只是想知道,因为我建议OP等待它一段时间,如果在那个时间段内没有空闲,那么就杀死它,但即使有无限循环等待空闲状态,它也没有被认真对待(我昨天在源代码中检查过)。