自己封装线程(Demo)

代码
unit theadTest;

interface

uses
  Windows, Classes;

type
  MyThread 
= class
  
private
    FHandle: THandle;
    FSuspended: Boolean;
    FThreadID: THandle;
    FThradNodity: TNotifyEvent;
    FTerminated:  Boolean;
    
procedure SetSuspended(Value: Boolean);
  
protected
    
procedure Execute; virtual;
    
property Terminated: Boolean read FTerminated;
  
public
    
constructor Create(CreateSuspended: Boolean);
    
destructor Destroy; override;
    
procedure Terminate;
    
property Handle: THandle read FHandle;
    
property Suspended: Boolean read FSuspended write SetSuspended;
    
property ThreadID: THandle read FThreadID;
    
property ThradNodity: TNotifyEvent read FThradNodity write FThradNodity;
  
end;

implementation

{ MyThread }

function ThreadProc(Param: Pointer): Integer;
begin
  
try
    
if not MyThread(Param).Terminated then
      
try
        MyThread(Param).Execute;
      
except
      
end;
  
finally
    Result :
= 0;
  
end;
end;  

constructor MyThread.Create(CreateSuspended: Boolean);
begin
  
inherited Create;
  FSuspended :
= CreateSuspended;
  FHandle :
= BeginThread(nil0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
end;

destructor MyThread.Destroy;
begin
  
if FHandle <> 0 then CloseHandle(FHandle);
  
inherited Destroy;
end;

procedure MyThread.Execute;
begin
  
while not Terminated do
  
begin
    
if Assigned(ThradNodity) then
      ThradNodity(
nil);
  
end;  
end;

procedure MyThread.SetSuspended(Value: Boolean);
begin
  
if Value <> FSuspended then
    FSuspended :
= Value;
end;

procedure MyThread.Terminate;
begin
  FTerminated :
= True;
end;

end.

调用
var
  Test1: MyThread;

var
  H: THandle;
begin
  Test1 := MyThread.Create(False);
  Test1.ThradNodity := ThreadNodity;

  DuplicateHandle(GetCurrentProcess, Test1.Handle, GetCurrentProcess, @H, DUPLICATE_SAME_ACCESS, TRUE, DUPLICATE_SAME_ACCESS);
  Windows.ResumeThread(H);
//  Windows.ResumeThread(Test1.Handle);
  Windows.ResumeThread(H);
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(Test1) then
  begin
    if Test1.Handle <> 0 then
      Test1.Terminate;
    Test1.Free;
  end;
end;


思路基本是DELPHI VCL 中Thread的封装思路,主要是测试用
VCL 中先创建一个挂起的线程,然后再调用,调用过程还是有点小复杂,

 

posted @ 2009-12-14 11:56  谭志宇  阅读(228)  评论(0编辑  收藏  举报