ThreadUnit.pas
上传用户:hndmjx
上传日期:2014-09-16
资源大小:3369k
文件大小:2k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {
  2.   Delphi Thread Unit by Aphex
  3.   http://iamaphex.cjb.net
  4.   unremote@knology.net
  5. }
  6. unit ThreadUnit;
  7. interface
  8. uses Windows;
  9. type
  10.   TThread = class;
  11.   TThreadProcedure = procedure(Thread: TThread);
  12.   TSynchronizeProcedure = procedure;
  13.   TThread = class
  14.   private
  15.     FThreadHandle: longword;
  16.     FThreadID: longword;
  17.     FExitCode: longword;
  18.     FTerminated: boolean;
  19.     FExecute: TThreadProcedure;
  20.     FData: pointer;
  21.   protected
  22.   public
  23.     constructor Create(ThreadProcedure: TThreadProcedure; CreationFlags: Cardinal);
  24.     destructor Destroy; override;
  25.     procedure Synchronize(Synchronize: TSynchronizeProcedure);
  26.     procedure Lock;
  27.     procedure Unlock;
  28.     property Terminated: boolean read FTerminated;
  29.     property ThreadHandle: longword read FThreadHandle;
  30.     property ThreadID: longword read FThreadID;
  31.     property ExitCode: longword read FExitCode;
  32.     property Data: pointer read FData write FData;
  33.   end;
  34. implementation
  35. var
  36.   ThreadLock: TRTLCriticalSection;
  37. procedure ThreadWrapper(Thread: TThread);
  38. var
  39.   ExitCode: dword;
  40. begin
  41.   Thread.FTerminated := False;
  42.   try
  43.     Thread.FExecute(Thread);
  44.   finally
  45.     GetExitCodeThread(Thread.FThreadHandle, ExitCode);
  46.     Thread.FExitCode := ExitCode;
  47.     Thread.FTerminated := True;
  48.     ExitThread(ExitCode);
  49.   end;
  50. end;
  51. constructor TThread.Create(ThreadProcedure: TThreadProcedure; CreationFlags: Cardinal);
  52. begin
  53.   inherited Create;
  54.   FExitCode := 0;
  55.   FExecute := ThreadProcedure;
  56.   FThreadHandle := BeginThread(nil, 0, @ThreadWrapper, Pointer(Self), CreationFlags, FThreadID);
  57. end;
  58. destructor TThread.Destroy;
  59. begin
  60.   inherited;
  61.   CloseHandle(FThreadHandle);
  62. end;
  63. procedure TThread.Synchronize(Synchronize: TSynchronizeProcedure);
  64. begin
  65.   EnterCriticalSection(ThreadLock);
  66.   try
  67.     Synchronize;
  68.   finally
  69.     LeaveCriticalSection(ThreadLock);
  70.   end;
  71. end;
  72. procedure TThread.Lock;
  73. begin
  74.   EnterCriticalSection(ThreadLock);
  75. end;
  76. procedure TThread.Unlock;
  77. begin
  78.   LeaveCriticalSection(ThreadLock);
  79. end;
  80. initialization
  81.   InitializeCriticalSection(ThreadLock);
  82. finalization
  83.   DeleteCriticalSection(ThreadLock);
  84. end.