我是一名DELPHI的初学者,学习当中遇到了困难,有段代码不甚明白。恳请各位高手帮助,谢谢。
这段程序是关于用互斥使线程同步。代码如下:

if waitforsingleobject(hmutex,infinite)=wait_object_0 then
begin
   ...
end;releasemutex(hmutex)
//hmutex是互斥量。
我不明白的是:首先执行waitforsingleobject(hmutex,infinite)的线程拥有了信号量,而且是使信号量处于不发信号状态,而if语句是判断信号量处于发信号状态才执行begin...end之间的语句;那么begin...end之间的代码能执行吗,为什么?期待您的赐教。

解决方案 »

  1.   

    begin...end之间的代码能执行的,只要hmutex有变化就可以执行了
    因为别的线程会改变hmutex的给一个例子,运行并等待程序结束
    function TExecForm.Exec(FileName: string; Visibility: integer): integer;
    var
      zappname:array [0..512] of char;
      zcurdir:array [0..255] of char;
      workdir:string;
      startupinfo:tstartupinfo;
      processinfo:tprocessinformation;
      exitcode:cardinal;
    begin
      strpcopy(zappname,filename);
      getdir(0,workdir);
      strpcopy(zcurdir,workdir);
      fillchar(startupinfo,sizeof(startupinfo),#0);
      startupinfo.cb:=sizeof(startupinfo);
      startupinfo.wShowWindow:=visibility;
      if not createprocess(nil,zappname,nil,nil,false,create_new_console or Normal_priority_class,
                           nil,nil,startupinfo,processinfo) then result:=-1
         else begin
    //等待程序结束
                waitforsingleobject(processinfo.hProcess,infinite);
    //程序结束时processinfo.hProcess将会改变
                getexitcodeprocess(processinfo.hProcess,exitcode);
                result:=exitcode;
              end;
    end;