Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- { TExeThreadTerm }
- type
- TExeThreadTerm = class{(TObject)}
- private
- FTerminated: boolean;
- public
- procedure Terminate(Sender: TObject);
- property Terminated: boolean read FTerminated;
- end;
- procedure TExeThreadTerm.Terminate(Sender: TObject);
- begin
- FTerminated := true;
- end;
- { CoExeThread }
- var
- CountCoExeThreads: integer;
- TerminateCoExeThreads: boolean;
- procedure CoExeThread(AThread: TThread);
- var
- ExeThreadTerm: TExeThreadTerm;
- Msg: TMsg;
- begin
- if not Assigned(AThread) then Exit;
- Inc(CountCoExeThreads);
- try
- if AThread.Suspended then
- AThread.Resume;
- ExeThreadTerm := TExeThreadTerm.Create;
- try
- AThread.OnTerminate := ExeThreadTerm.Terminate;
- while true do
- begin
- if TerminateCoExeThreads then
- begin
- WaitForSingleObject(AThread.Handle, INFINITE);
- Break;
- end;
- while true do
- begin
- if not PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then Break;
- Application.HandleMessage;
- end;
- WaitForSingleObject(AThread.Handle, 50);
- if ExeThreadTerm.Terminated then break;
- end;
- finally
- ExeThreadTerm.Free;
- end;
- finally
- Dec(CountCoExeThreads);
- end;
- end;
- { CoExeThreadsTerminate }
- procedure CoExeThreadsTerminate;
- begin
- TerminateCoExeThreads := true;
- try
- while true do
- begin
- if not(CountCoExeThreads > 0) then Break;
- Sleep(50);
- end;
- finally
- TerminateCoExeThreads := false;
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement