Delphi实现Singleton模式

益灵集团

益灵集团

2016-02-19 18:24

下面图老师小编要跟大家分享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
  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.Size5000000 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.
展开更多 50%)
分享

猜你喜欢

Delphi实现Singleton模式

编程语言 网络编程
Delphi实现Singleton模式

Singleton设计模式的C#实现

编程语言 网络编程
Singleton设计模式的C#实现

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

设计模式之singleton

编程语言 网络编程
设计模式之singleton

五种单件模式之Singleton的实现方法详解

编程语言 网络编程
五种单件模式之Singleton的实现方法详解

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

C++设计模式之Singleton

编程语言 网络编程
C++设计模式之Singleton

C++ 中的Singleton 类的实现讨论

编程语言 网络编程
C++ 中的Singleton 类的实现讨论

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

对Delphi接口的又一疑惑:怎么会自动释构的?

对Delphi接口的又一疑惑:怎么会自动释构的?

绑架窗体之Delphi版

绑架窗体之Delphi版
下拉加载更多内容 ↓