dephi WaitForMultipleObjects 用法 在Delphi中WaitForMultipleObjects的使用

  1. procedure ThreadTest;stdcall;
  2. var
  3. Handles:TWOHandleArray;
  4. //Handle:THandle;
  5. Test:TTest;
  6. i:Integer;
  7. begin
  8. for i := 0 to 10 do
  9. begin
  10. Test := TTest.Create(False);
  11. Handles[i] := Test.Handle;
  12. end;
  13. WaitForMultipleObjects( 11, @Handles, True, INFINITE );
  14. Form1.mmo1.Lines.Add( '123' );
  15. end;
  16. procedure TForm1.btn1Click(Sender: TObject);
  17. var
  18. ID:Cardinal;
  19. begin
  20. CreateThread( nil, 0, @ThreadTest, nil, 0, ID );
  21. end;
  22. procedure TTest.Execute;
  23. begin
  24. { Place thread code here }
  25. //FreeOnTerminate := False;
  26. form1.mmo1.Lines.Add( 'ok' );
  27. end;

这个例子如果把WaitForMultipleObjects函数放在主线程中执行(btn1Click),会造成线程死锁。这是因为在创建完所有线程后WaitForMultipleObjects函数会导致主线程锁定,等待所有子线程执行完毕。而由于在TTest子线程中需要进行界面交互,会导致死锁。

简单的说,如果A为主线程,B为子线程。WaitForMultipleObjects将A锁定,B操作memo控件,要等待A解锁后才能执行,所以就会导致B永远在那里等待。而B未结束,相应的A中的WaitForMultipleObjects也只能永远等待了。

  1. procedure ThreadTest;stdcall;
  2. var
  3. Handles:TWOHandleArray;
  4. //Handle:THandle;
  5. Test:TTest;
  6. i:Integer;
  7. begin
  8. for i := 0 to 10 do
  9. begin
  10. Test := TTest.Create(False);
  11. Handles[i] := Test.Handle;
  12. end;
  13. WaitForMultipleObjects( 11, @Handles, True, INFINITE );
  14. Form1.mmo1.Lines.Add( '123' );
  15. end;
  16. procedure TForm1.btn1Click(Sender: TObject);
  17. var
  18. ID:Cardinal;
  19. begin
  20. CreateThread( nil, 0, @ThreadTest, nil, 0, ID );
  21. end;
  22. procedure TTest.Execute;
  23. begin
  24. { Place thread code here }
  25. //FreeOnTerminate := False;
  26. form1.mmo1.Lines.Add( 'ok' );
  27. end;

这个例子如果把WaitForMultipleObjects函数放在主线程中执行(btn1Click),会造成线程死锁。这是因为在创建完所有线程后WaitForMultipleObjects函数会导致主线程锁定,等待所有子线程执行完毕。而由于在TTest子线程中需要进行界面交互,会导致死锁。

简单的说,如果A为主线程,B为子线程。WaitForMultipleObjects将A锁定,B操作memo控件,要等待A解锁后才能执行,所以就会导致B永远在那里等待。而B未结束,相应的A中的WaitForMultipleObjects也只能永远等待了。