用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.

时间: 2025-01-20 10:01:36

用Delphi实现Singleton模式的相关文章

java Singleton模式

Java Singleton 模式用来保证在运行的应用程序中,一个Class只是实例化一次,也就是只有一个相应的对象存在.在 web 程序中我们会用一个核心的分配功能的Servlet程序,在这里我们就可以运用这种设计模式了.一般Singleton模式通常有几种种形式:第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法.public clas

C++/CLI中实现singleton模式

双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值.在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类.这种方式很好地消除了一些重复代码臭味,而且,优化后的性能较标准互斥版本提高15倍.最近在用C++/CLI做一些工作,Singleton不可避免地需要用到,于是我又制造了一次车轮. 1 #pragma once2 3 /** \class sidle::Singleton4 \bri

设计模式的解析和实现(C++)之五-Singleton模式

作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点. UML结构图: 解析: Singleton模式其实是对全局静态变量的一个取代策略,上面提到的Singleton模式的两个作用在C++中是通过如下的机制实现的:1)仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对于一个类的所有对象而言是惟一的 2)提供一个访问它的全局访问点,也就是提供对应的访问这个静态成员变量的静态成员函数,对类的所有对象而言也是惟一的.在C++中,可以直接使用类域进行访问而不必初始化一个类的对象.

singleton模式

或许最简单的设计范式就是"单子"(Singleton),它能提供对象的一个(而且只有一个)实例.单子在Java库中得到了应用,但下面这个例子显得更直接一些:   //: SingletonPattern.java // The Singleton design pattern: you can // never instantiate more than one. package c16; // Since this isn't inherited from a Cloneable /

设计模式学习笔记(九)—Singleton模式

<设计模式>一书对Singleton模式是这样描述的: 保证一个类只有一个实例,并提供一个访问它的全局访问点. 这个模式比较简单,下面给出一个例子: public class Singleton { private static Singleton instance; private Singleton(){ } public static Singleton getInstance(){ if(instance==null) instance=new Singleton(); return

Python使用metaclass实现Singleton模式的方法

  本文实例讲述了Python使用metaclass实现Singleton模式的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Singleton(type): def __call__(cls, *args, **kwargs): print "Singleton call" if not hasattr(cls, 'instance'): cls.

多线程-用c++实现singleton模式。

问题描述 用c++实现singleton模式. 作业:用c++实现singleton模式.具体的该如何下手啊?关于C++多线程的书籍知道的比较好的帮忙推荐一下了.谢谢 解决方案 C++多线程的书籍推荐台湾侯捷的<Win32 多绪程式设计> 解决方案二: class singleton { private: singleton() { } //封闭构造函数 private: static singleton * _instance; // 唯一实例 public: static singleto

Design Pattern: Singleton 模式

一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance).  很多时候,您会需要Singleton模式,例如印表机管理,您希望程式中只能有一个Print Spooler,以避免两个列印动作同时输入至印表机中:例如资料库管理,因为建立连接(Connection)物件会耗用资源,您希望程式中只能有一个 连接物件,所有其它的程式都透过这个物件来连接资料库,以避免连接物件

应用-singleton模式在京东,淘宝,唯品会,哪个地方用了??

问题描述 singleton模式在京东,淘宝,唯品会,哪个地方用了?? 有知道singleton具体应用地方的吗??还有同一个账户,两台机器,同时登陆,会出现什么效果??淘宝,京东,是怎么解决这个问题的?? 解决方案 其实就是从HTTP请求里读出IP地址.如果两次之间的IP不一样.就采取措施 解决方案二: 你说的那个是单点登录问题,一个地方登录,其它服务器也应该同步状态,或者能知道该用户已经登录,现在是有解决办法的,你可以搜一下 单点登录 解决方案三: 个是单点登录问题,一个地方登录,其它服务器