Advertisement
Guest User

Untitled

a guest
Jul 28th, 2014
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 1.46 KB | None | 0 0
  1. { TExeThreadTerm }
  2.  
  3. type
  4.  
  5.   TExeThreadTerm = class{(TObject)}
  6.   private
  7.     FTerminated: boolean;
  8.   public
  9.     procedure Terminate(Sender: TObject);
  10.     property Terminated: boolean read FTerminated;
  11.   end;
  12.  
  13. procedure TExeThreadTerm.Terminate(Sender: TObject);
  14. begin
  15. FTerminated := true;
  16. end;
  17.  
  18. { CoExeThread }
  19.  
  20. var
  21.  
  22.   CountCoExeThreads: integer;
  23.   TerminateCoExeThreads: boolean;
  24.  
  25. procedure CoExeThread(AThread: TThread);
  26. var
  27.    ExeThreadTerm: TExeThreadTerm;
  28.    Msg: TMsg;
  29. begin
  30. if not Assigned(AThread) then Exit;
  31.  
  32. Inc(CountCoExeThreads);
  33. try
  34. if AThread.Suspended then
  35.    AThread.Resume;
  36.  
  37. ExeThreadTerm := TExeThreadTerm.Create;
  38. try
  39. AThread.OnTerminate := ExeThreadTerm.Terminate;
  40.  
  41. while true do
  42.    begin
  43.    if TerminateCoExeThreads then
  44.       begin
  45.       WaitForSingleObject(AThread.Handle, INFINITE);
  46.       Break;
  47.       end;
  48.  
  49.    while true do
  50.       begin
  51.       if not PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then Break;
  52.       Application.HandleMessage;
  53.       end;
  54.  
  55.    WaitForSingleObject(AThread.Handle, 50);
  56.  
  57.    if ExeThreadTerm.Terminated then break;
  58.    end;
  59.  
  60.    finally
  61.    ExeThreadTerm.Free;
  62.    end;
  63.  
  64.    finally
  65.    Dec(CountCoExeThreads);
  66.    end;
  67. end;
  68.  
  69. { CoExeThreadsTerminate }
  70.  
  71. procedure CoExeThreadsTerminate;
  72. begin
  73. TerminateCoExeThreads := true;
  74. try
  75. while true do
  76.    begin
  77.    if not(CountCoExeThreads > 0) then Break;
  78.    Sleep(50);
  79.    end;
  80.  
  81.    finally
  82.    TerminateCoExeThreads := false;
  83.    end;
  84. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement