电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> delphi技术>>Delphi实现Singleton模式:

Delphi实现Singleton模式

来源:www.cncfan.com | 2006-1-10 | (有1792人读过)

单例模式用于限制进程中只有一个某个类的对象,本例的Singleton是一个线程实例,在每一个时钟到达时检测是否到达某个时刻(本例的时刻存于Ini文件中),如果到达则产生一个线程,但是如果在这个线程完成其任务前又到达一个时钟,则有可能会产生多个线程执行任务,以致出现混乱,所以考虑使用Singleton模式解决这个问题(当然还有其他解决方案,但本例使用的是Singleton)。

核心代码如下:

//timer单元
procedure TService1.Timer_mainTimer(Sender: TObject);
var
mystringlist:TStringList;
SearchRec: TSearchRec;
nowtime :string;
begin
try
DateTimeToString(nowtime,'hh:nn',now);
if LeftStr(nowtime,4)=LeftStr(GetMSG('GAME','下发时间',theexename+'.ini'),4) then
begin
//创建发送线程
Global_Instance:=TSendThread.getInstance;
//////////////
end;
except
on e: Exception do
begin
mystringlist:=TStringList.Create;
if FileExists(ExtractFilePath(Paramstr(0))+'Err.txt') then
mystringlist.LoadFromFile(ExtractFilePath(Paramstr(0))+'Err.txt');
mystringlist.Add('('+DateTimeToStr(Now)+')[创建线程出错:]'+E.Message);
mystringlist.SaveToFile(ExtractFilePath(Paramstr(0))+'Err.txt');
mystringlist.Free;
if FindFirst(ExtractFilePath(Paramstr(0))+'Err.txt', faAnyFile, SearchRec)=0 then
begin
if SearchRec.Size>5000000 then
begin
RenameFile(ExtractFilePath(Paramstr(0))+'Err.txt',ansireplacestr(ExtractFilePath(Paramstr(0))+'Err.txt','.txt',FormatDateTime('yyyy-MM-dd hh-mm-ss',now)+'.txt'));
end;
end;
end;
end;
end;
//线程单元
unit Unit_Send ;

interface
uses
SysUtils, Classes,StrUtils,main;
type
TSendThread = class(TThread)
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy; override;
class function getInstance:TSendThread;
procedure joke;

protected
procedure Execute; override;
end;

var
Global_Instance:TSendThread;

implementation

uses DB;


class function TSendThread.getInstance:TSendThread;
begin
if Global_Instance=nil then
begin
Global_Instance:=TSendThread.Create(false);
end;
Result:=Global_Instance;
end;
constructor TSendThread.Create(CreateSuspended: Boolean);
begin
if Global_Instance=nil then
begin
inherited Create(CreateSuspended);
FreeOnTerminate:=true ;
end
else
raise Exception.CreateFmt('Can not create more than one TSendThread instance!',[SysErrorMessage(0)]);
end;
destructor TSendThread.Destroy;
begin
inherited Destroy;
end;
procedure TSendThread.joke;
begin
end;
procedure TSendThread.Execute;
var
theuser:TUserInfo;
tmpSql:string;
begin
//执行任务
//处理定时下发 '+GameInfo.mainusertable+'
tmpSql:='select * from '+mainusertable+' where destroy=0 order by id';
Service1.ADOQuery_send.Connection:=conn_Server;
SQLQuery(Service1.ADOQuery_send,tmpSql);
while (not Service1.ADOQuery_send.Eof) and (not Terminated) do
begin
theuser.SeqID:='0';
theuser.UID:='';
theuser.Spc:=GetMSG('PARAMETER','Spcode',theexename+'.ini');
theuser.RecordID:='0';
theuser.Mob:=Service1.ADOQuery_send.FieldByname('mobile').AsString;
AutoJoke(theuser);
Service1.ADOQuery_send.Next;
end;
Sleep(600001);
Global_Instance:=nil;
Terminate;
//任务完成
end;
end.

delphi技术热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号