中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
用Delphi实现Singleton模式
作者:未知 时间:2005-01-05 12:12 出处:CSDN 责编:chinaitpower
              摘要:暂无
单例模式用于限制进程中只有一个某个类的对象,本例的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.

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有