0

インストーラーの一部として、DBMS システムを呼び出してシャットダウンし、後で起動する必要があります。その DBMS が何らかの理由でハングすると、インストーラーが永久にハングします。データベースを起動または停止するコマンドに対して Exec を呼び出します。私の質問は次のとおりです。

ewWaitUntilIdle の正確な定義は何ですか? データベースを開始/停止するコマンドが戻ってこない場合、アイドル状態の条件を満たしているものは何ですか?

4

1 に答える 1

1

これは、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;

ご覧のとおり、ewWaitUntilIdle は単純にWaitForInputIdle関数を使用しています

于 2012-07-13T04:49:08.343 に答える