当前位置:首页 > 网络编程 > 软件语言 > DELPHI > Delphi实现Singleton模式

Delphi实现Singleton模式

点击次数:69 次 发布日期:2008-11-09 08:36:24 作者:源代码网
源代码网推荐
广告载入中
单例模式用于限制进程中只有一个某个类的对象,本例的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.
----------------------------------------- 飘飘何所似?天地一沙鸥。

源代码网推荐

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华