欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

自己封装线程(Demo)

发布时间:2025/7/14 编程问答 55 豆豆
生活随笔 收集整理的这篇文章主要介绍了 自己封装线程(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 中先创建一个挂起的线程,然后再调用,调用过程还是有点小复杂,

 

转载于:https://www.cnblogs.com/chengxin1982/archive/2009/12/14/1623575.html

总结

以上是生活随笔为你收集整理的自己封装线程(Demo)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。