在Delphi中WaitForMultipleObjects的使用
- procedure ThreadTest;stdcall;
- var
- Handles:TWOHandleArray;
- //Handle:THandle;
- Test:TTest;
- i:Integer;
- begin
- for i := 0 to 10 do
- begin
- Test := TTest.Create(False);
- Handles[i] := Test.Handle;
- end;
- WaitForMultipleObjects( 11, @Handles, True, INFINITE );
- Form1.mmo1.Lines.Add( '123' );
- end;
- procedure TForm1.btn1Click(Sender: TObject);
- var
- ID:Cardinal;
- begin
- CreateThread( nil, 0, @ThreadTest, nil, 0, ID );
- end;
- procedure TTest.Execute;
- begin
- { Place thread code here }
- //FreeOnTerminate := False;
- form1.mmo1.Lines.Add( 'ok' );
- end;
这个例子如果把WaitForMultipleObjects函数放在主线程中执行(btn1Click),会造成线程死锁。这是因为在创建完所有线程后WaitForMultipleObjects函数会导致主线程锁定,等待所有子线程执行完毕。而由于在TTest子线程中需要进行界面交互,会导致死锁。
简单的说,如果A为主线程,B为子线程。WaitForMultipleObjects将A锁定,B操作memo控件,要等待A解锁后才能执行,所以就会导致B永远在那里等待。而B未结束,相应的A中的WaitForMultipleObjects也只能永远等待了。