在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也只能永远等待了。

你可能感兴趣的:(在Delphi中WaitForMultipleObjects的使用)