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休眠,函数一直没有返回 才对,就是说程序一直处于等待状态,可是为什么调试的时候 直接就返回了呢?谢谢~
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休眠,函数一直没有返回 才对,就是说程序一直处于等待状态,可是为什么调试的时候 直接就返回了呢?谢谢~
也就是没有任何线程拥有他,一个Mutex在没有任何线程拥有他的时候,他是处于激发态的,
所以第一个::WaitForSingleObject()函数便返回,释放了该线程对Mutex的拥有权,Mutex又会变成激发态,这样就导致了第二个::WaitForSingleObject()函数的返回!
不过这个根本没必要用线程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;
过年要回家了 结贴~