首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

再来捧场,发一个线程基类的源代码,嘿嘿解决思路

2012-02-14 
再来捧场,发一个线程基类的源代码,嘿嘿unit GDKWithThreadinterfaceusesClasses,Windowstype///////////

再来捧场,发一个线程基类的源代码,嘿嘿
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

热点排行