1.线程代码:
procedure TTest.Execute;
var
  i:integer;
begin
  { Place thread code here }
  OnTerminate:=Form1.Done;
  if WaitForSingleObject(HMux,INFINITE)=WAIT_OBJECT_0 then
  begin
  for i:= 1 to 128 do
    begin
      Garry[i]:=form1.Getnum();
      sleep(5);
    end;
  end;
  //ReleaseMutex(HMux);
end;end.
2.主体
procedure TForm1.Button1Click(Sender: TObject);
begin
 HMux:=CreateMutex(nil,false,nil);
 TTest.Create(false);
 TTest.Create(false);
end;请高手解释下WaitForSingleObject 在不使用//ReleaseMutex(HMux); 释放互斥体的情况下 程序应该一直把线程#2休眠,函数一直没有返回 才对,就是说程序一直处于等待状态,可是为什么调试的时候 直接就返回了呢?谢谢~ 

解决方案 »

  1.   

    希望对你有帮助你的CreateMutex()函数的第二个参数是FALSE,表示刚刚创建的这个Mutex不属于任何线程  
      也就是没有任何线程拥有他,一个Mutex在没有任何线程拥有他的时候,他是处于激发态的,  
      所以第一个::WaitForSingleObject()函数便返回,释放了该线程对Mutex的拥有权,Mutex又会变成激发态,这样就导致了第二个::WaitForSingleObject()函数的返回!   
      

  2.   

    刚创建的这个Mutex不属于任何线程,此时首先调用WaitForSingleObject()函数的线程就成为该互斥对象的拥有者,此互斥对象设为不发信号状态。当线程调用 ReleaseMutex()函数并传递一个互斥对象的句柄作为参数时,这种拥有关系就被解除,互斥对象重新进入发信号状态。WaitForSingleObject(HMux,INFINITE) INFINITE 参数表示一直等待,直到有信号。在调试的时候却没有等待~~
      

  3.   

    我已做测试,这个是按线程输出的,第一个线程执行完毕,才会执行唤醒第二个线程。
    不过这个根本没必要用线程type
      TTestThread=class(TThread)
      public
        constructor Create(CreateSuspended: Boolean);
        destructor Destroy; override;
        procedure Execute;override;  end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      HMux:=CreateMutex(nil,false,nil);
      TestThread := TTestThread.Create(True);
      TestThread.Resume;
      TestThread1 := TTestThread.Create(True);
      TestThread1.Resume;
    end;{ TTestThread }constructor TTestThread.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);
    end;destructor TTestThread.Destroy;
    begin  inherited;
    end;procedure TTestThread.Execute;
    var i:Integer;
        str:string;
    begin
        if WaitForSingleObject(HMux,INFINITE)=WAIT_OBJECT_0 then
        begin
        for i:= 1 to 128 do
          begin
            sleep(5);
          end;
        end;
        ReleaseMutex(HMux);
    end;
      

  4.   

    我不是为了做程序,是想知道WaitForSingleObject的运行机制,不过还是谢谢你 ~
    过年要回家了 结贴~