Advertisement
TLama

Untitled

Aug 15th, 2014
553
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 1.53 KB | None | 0 0
  1. type
  2.   TMyThread = class(TThread)
  3.   type
  4.     TEventType = (etWork, etExit);
  5.   private
  6.     FEvents: array[TEventType] of THandle;
  7.   protected
  8.     procedure Execute; override;
  9.     procedure TerminatedSet; override;
  10.   public
  11.     constructor Create;
  12.     destructor Destroy; override;
  13.     procedure Stop; virtual;
  14.     procedure Pause; virtual;
  15.     procedure UnPause; virtual;
  16.   end;
  17.  
  18. implementation
  19.  
  20. { TMyThread }
  21.  
  22. constructor TMyThread.Create;
  23. begin
  24.   inherited;
  25.   FEvents[etWork] := CreateEvent(nil, True, False, nil);
  26.   FEvents[etExit] := CreateEvent(nil, False, False, nil);
  27. end;
  28.  
  29. destructor TMyThread.Destroy;
  30. var
  31.   Event: THandle;
  32. begin
  33.   for Event in FEvents do
  34.     CloseHandle(Event);
  35.   inherited;
  36. end;
  37.  
  38. procedure TMyThread.Execute;
  39. const
  40.   EventCount = Length(FEvents);
  41.   WAIT_EVENT_WORK = WAIT_OBJECT_0 + Ord(etWork);
  42.   WAIT_EVENT_EXIT = WAIT_OBJECT_0 + Ord(etExit);
  43. begin
  44.   while not Terminated do
  45.   begin
  46.     case WaitForMultipleObjects(EventCount, @FEvents, False, INFINITE) of
  47.       WAIT_EVENT_WORK:
  48.       begin
  49.         // do some work
  50.       end;
  51.       WAIT_EVENT_EXIT: Exit;
  52.       WAIT_FAILED: RaiseLastOSError;
  53.     end;
  54.   end;
  55. end;
  56.  
  57. procedure TMyThread.TerminatedSet;
  58. begin
  59.   inherited;
  60.   SetEvent(FEvents[etExit]);
  61. end;
  62.  
  63. procedure TMyThread.Stop;
  64. begin
  65.   Terminate;
  66. end;
  67.  
  68. procedure TMyThread.Pause;
  69. begin
  70.   if not ResetEvent(FEvents[etWork]) then
  71.     RaiseLastOSError;
  72. end;
  73.  
  74. procedure TMyThread.UnPause;
  75. begin
  76.   if not SetEvent(FEvents[etWork]) then
  77.     RaiseLastOSError;
  78. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement