读书人

再来捧场发一个线程基类的源代码嘿

发布时间: 2012-02-14 19:19:19 作者: rapoo

再来捧场,发一个线程基类的源代码,嘿嘿
unit GDKWithThread;

interface
uses

Classes,Windows;

type
////////////////////////////////////////////////////////////////////////////////
//以下定义线程类,这也是所有线程的基类;
TGDKThread = class
private
m_Handle : THandle;//线程句柄
m_ThreadID : Cardinal; //这个是自动获得的;
m_ID : Integer;
m_GroupID : Integer;//线程组别;
m_NickName : String;//线程名称;

m_IsSuspended : Boolean; //目前线程的状态是否挂起;
m_IsOutOfRun : Boolean; //是否退出了主循环
m_IsStopped : Boolean;
public
constructor Create(CreateSuspended: Boolean); overload;
destructor Destroy; override;
published
property Handle : THandle read m_Handle;
property ThreadID : Cardinal read m_ThreadID;

property IsSuspended : Boolean read m_IsSuspended ;
property IsOutOfRun : Boolean read m_IsOutOfRun ;

property ID : Integer read m_ID write m_ID;
property GroupID : Integer read m_GroupID write m_GroupID;
property NickName : String read m_NickName write m_NickName;

public
procedure MainRun;

procedure Resume; //启动线程;
procedure Suspend; //挂起线程;

procedureStop; //强制退出,其实设置 m_IsStopped = true ,等退出Run;
function WaitFor(ATimeout:Cardinal):Integer; //根据一定时间,等待outofrun信号,嘿嘿;

//所有的线程都必须重载此方法!!!
procedure RunBefore;virtual;//行动准备
procedure RunAfter ;virtual;//撤离准备
procedure Run ;virtual;//执行体
end;
////////////////////////////////////////////////////////////////////////////////
implementation

////////////////////////////////////////////////////////////////////////////////
function GDKThread_Entry(lpThread: Pointer): Integer;
var
_thread : TGDKThread;
begin
_thread := lpThread;
try
_thread.MainRun;
except
end;
Result := 0;
end;
////////////////////////////////////////////////////////////////////////////////
{ TGDKThread }

constructor TGDKThread.Create(CreateSuspended: Boolean);
var
dwCreateFlags : DWORD;
begin
m_IsOutOfRun := false;
m_IsStopped := false;
m_IsSuspended := CreateSuspended;

dwCreateFlags := 0;
if CreateSuspended then dwCreateFlags :=4;

m_Handle := beginthread(nil,0,@GDKThread_Entry,Self,dwCreateFlags,m_ThreadID);
end;

destructor TGDKThread.Destroy;
begin
try
CloseHandle(m_Handle);
m_Handle :=0;
except
end;
m_ThreadID := 0;
end;

procedure TGDKThread.MainRun;
begin
RunBefore;

while(true) do
begin
Sleep(10);

//Sleep在子类内部去做!!
if m_IsStopped then
begin
RunAfter;
break;
end;
//执行主循环!!!
Run;
end;

m_IsOutOfRun := true;//标记线程已经退出了主循环体

end;

procedure TGDKThread.Resume;
begin
if (m_IsSuspended) then
begin
ResumeThread(m_Handle);
m_IsSuspended := false;
end;
end;

procedure TGDKThread.Suspend;
begin
if (not m_IsSuspended) then
begin
SuspendThread(m_Handle);
m_IsSuspended := true;
end;
end;

procedure TGDKThread.Stop;
begin
m_IsStopped := true;
end;

function TGDKThread.WaitFor(ATimeout: Cardinal): Integer;
var
_T0 : Cardinal;
begin
Result := -1;

_T0 := GetTickCount;


while (true) do
begin
if IsOutOfRun then
begin
Result := 1;
break;
end;

if GetTickCount - _T0 > ATimeout then break;

Sleep(10);
end;
end;

procedure TGDKThread.Run;
begin

end;

procedure TGDKThread.RunBefore;
begin

end;

procedure TGDKThread.RunAfter;
begin

end;
////////////////////////////////////////////////////////////////////////////////

end.


[解决办法]
mark
[解决办法]
mark
[解决办法]
mark
[解决办法]
mark
[解决办法]
lz让我想起1个人,蜡笔小星。嘿嘿
[解决办法]
呵呵,joke
[解决办法]
学习
[解决办法]
mark

读书人网 >.NET

热点推荐