Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type
- TMyThread = class(TThread)
- type
- TEventType = (etWork, etExit);
- private
- FEvents: array[TEventType] of THandle;
- protected
- procedure Execute; override;
- procedure TerminatedSet; override;
- public
- constructor Create;
- destructor Destroy; override;
- procedure Stop; virtual;
- procedure Pause; virtual;
- procedure UnPause; virtual;
- end;
- implementation
- { TMyThread }
- constructor TMyThread.Create;
- begin
- inherited;
- FEvents[etWork] := CreateEvent(nil, True, False, nil);
- FEvents[etExit] := CreateEvent(nil, False, False, nil);
- end;
- destructor TMyThread.Destroy;
- var
- Event: THandle;
- begin
- for Event in FEvents do
- CloseHandle(Event);
- inherited;
- end;
- procedure TMyThread.Execute;
- const
- EventCount = Length(FEvents);
- WAIT_EVENT_WORK = WAIT_OBJECT_0 + Ord(etWork);
- WAIT_EVENT_EXIT = WAIT_OBJECT_0 + Ord(etExit);
- begin
- while not Terminated do
- begin
- case WaitForMultipleObjects(EventCount, @FEvents, False, INFINITE) of
- WAIT_EVENT_WORK:
- begin
- // do some work
- end;
- WAIT_EVENT_EXIT: Exit;
- WAIT_FAILED: RaiseLastOSError;
- end;
- end;
- end;
- procedure TMyThread.TerminatedSet;
- begin
- inherited;
- SetEvent(FEvents[etExit]);
- end;
- procedure TMyThread.Stop;
- begin
- Terminate;
- end;
- procedure TMyThread.Pause;
- begin
- if not ResetEvent(FEvents[etWork]) then
- RaiseLastOSError;
- end;
- procedure TMyThread.UnPause;
- begin
- if not SetEvent(FEvents[etWork]) then
- RaiseLastOSError;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement