Inno setup 在Inno设置中,EWAitUntilidle的精确定义是什么?

Inno setup 在Inno设置中,EWAitUntilidle的精确定义是什么?,inno-setup,Inno Setup,作为安装程序的一部分,我需要调用DBMS系统并关闭它,然后再启动它。如果DBMS由于某种原因挂起,我的安装程序将永远挂起。我调用Exec命令来启动或停止数据库,我的问题是: ewWaitUntilIdle的确切定义是什么?如果我的启动/停止数据库的命令再也没有返回,那么什么满足空闲条件?这是Inno的源代码: procedure HandleProcessWait(ProcessHandle: THandle; const Wait: TExecWait; const ProcessMess

作为安装程序的一部分,我需要调用DBMS系统并关闭它,然后再启动它。如果DBMS由于某种原因挂起,我的安装程序将永远挂起。我调用Exec命令来启动或停止数据库,我的问题是:


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等待它一段时间,如果在那个时间段内没有空闲,那么就杀死它,但即使有无限循环等待空闲状态,它也没有被认真对待(我昨天在源代码中检查过)。