Delphi实现Singleton模式

        单例模式用于限制进程中只有一个某个类的对象,本例的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 //捕获错误存入txt文件
            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;

    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.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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值