WaitForSingleObject这个函数看得一头雾水啊高人们讲解下啊

解决方案 »

  1.   

    DWORD WaitForSingleObject( 
      HANDLE hHandle, 
      DWORD dwMilliseconds 
    ); 
    WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。在这里举个例子:
      

  2.   


    给你一个示例代码
    procedure TForm1.Button1Click(Sender: TObject);
      function WinExecAndWait32(FileName: string; Visibility: integer): Cardinal;
      var
        zAppName: array[0..512] of char;
        zCurDir: array[0..255] of char;
        WorkDir: string;
        StartupInfo: TStartupInfo;
        ProcessInfo: TProcessInformation;
      begin
        StrPCopy(zAppName, FileName);
        GetDir(0, WorkDir);
        StrPCopy(zCurDir, WorkDir);
        FillChar(StartupInfo, Sizeof(StartupInfo), #0);
        StartupInfo.cb := Sizeof(StartupInfo);
        StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
        StartupInfo.wShowWindow := Visibility;
        if not CreateProcess(nil,
          zAppName,
          nil,
          nil,
          true,
          CREATE_NEW_CONSOLE or
          NORMAL_PRIORITY_CLASS,
          nil,
          nil,
          StartupInfo,
          ProcessInfo)
          then Result := INFINITE
        else
        begin
          WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
          GetExitCodeProcess(ProcessInfo.hProcess, Result);
          CloseHandle(ProcessInfo.hProcess);
          CloseHandle(ProcessInfo.hThread);
        end;
      end;
    begin
      WinExecAndWait32_v1('c:\1.exe',0);
    end;
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
      function WinExecAndWait32(FileName: string; Visibility: integer): Cardinal;
      var
        zAppName: array[0..512] of char;
        zCurDir: array[0..255] of char;
        WorkDir: string;
        StartupInfo: TStartupInfo;
        ProcessInfo: TProcessInformation;
      begin
        StrPCopy(zAppName, FileName);
        GetDir(0, WorkDir);
        StrPCopy(zCurDir, WorkDir);
        FillChar(StartupInfo, Sizeof(StartupInfo), #0);
        StartupInfo.cb := Sizeof(StartupInfo);
        StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
        StartupInfo.wShowWindow := Visibility;
        if not CreateProcess(nil,
          zAppName,
          nil,
          nil,
          true,
          CREATE_NEW_CONSOLE or
          NORMAL_PRIORITY_CLASS,
          nil,
          nil,
          StartupInfo,
          ProcessInfo)
          then Result := INFINITE
        else
        begin
          WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
          GetExitCodeProcess(ProcessInfo.hProcess, Result);
          CloseHandle(ProcessInfo.hProcess);
          CloseHandle(ProcessInfo.hThread);
        end;
      end;
    begin
      WinExecAndWait32('c:\1.exe',0);
    end;
      

  4.   

    WaitForSingleObject(   
        HANDLE  : hHandle,   
        DWORD  : dwMilliseconds   
    );   
    等到句柄为Handle的操作结束后才继续执行,另外时间不能超过DWORD,否则就继续执行下面的语句
    一共2个参数
    第一个是对象的句柄
    比如说用CreateProcess创建一个进程,然后把进程的句柄叫给WaitForSingleObject就可以让程序等待到创建的进程结束之后再继续执行
    第二个是超时时间,单位是毫秒,如果想一直等待它执行下去 这里就填INFINITE.