Singletonモードは、この例のSingletonの特定のクラスの1つのオブジェクトのみを制限するために使用されます。 )、到着がスレッドを生成しますが、このスレッドがタスクを完了する前に別のクロックに到達した場合、複数のスレッドを生成してタスクを実行する可能性があります。ソリューションですが、この例はSingletonを使用しています)。
コアコードは次のとおりです。
//タイマーユニット
手順tservice1.timer_maintimer(sender:tobject);
var
MyStringList:TStringList;
SearchRec:TsearchRec;
今すぐ:文字列;
始める
試す
DateTimetString(NowTime、 'HH:nn'、Now);
leftStr(nowtime、4)= leftStr(getMSG( 'game'、 'susuance time'、theexename+'。ini')、4)
始める
//送信スレッドを作成します
Global_instance:= tsendthread.getInstance;
///////////////////////////
終わり;
を除外する
E:例外はそうします
始める
mystringlist:= tstringlist.create;
fileexists(extractfilepath(paramstr(0))+'err.txt')の場合
mystringlist.loadfromfile(extractfilepath(paramstr(0))+'err.txt');
mystringlist.add( '('+dateTimetoStr(now)+')[エラー作成スレッド:]'+e.message);
mystringlist.savetofile(extractfilepath(paramstr(0))+'err.txt');
mystringlist.free;
findfirst(extractfilepath(paramstr(0))+'err.txt'、faanyfile、searchrec)= 0の場合
始める
search.size> 5000000の場合
始める
renamefile(extractfilepath(paramstr(0))+'err.txt'、ansireplacestr(extractfilepath(paramstr(0))+'err.txt'、 '。txt'、formatdatetime( 'yyyy-mm-dd hh-mm-s) '、Now)+'。Txt '));
終わり;
終わり;
終わり;
終わり;
終わり;
//スレッドユニット
unit unit_send;
インタフェース
用途
sysutils、classes、strutils、main;
タイプ
tsendthread = class(tthread)
公共
Constructor create(createSuspended:boolean);
破壊者はオーバーライドします。
クラス関数getInstance:tsendthread;
手順ジョーク;
保護されています
手順実行;
終わり;
var
Global_instance:tsendthread;
実装
DBを使用します。
クラス関数tsendthread.getInstance:tsendthread;
始める
global_instance = nilの場合
始める
Global_instance:= tsendthread.create(false);
終わり;
結果:= global_instance;
終わり;
constructor tsendthread.create(createSuspended:boolean);
始める
global_instance = nilの場合
始める
継承されたcreate(createSuspended);
FreeOnterminate:= true;
終わり
それ以外
rease exception.createfmt( '複数のtsendthreadインスタンスを作成することはできません!'、[syserrormessage(0)]);
終わり;
Destructor tsendthread.destroy;
始める
継承された破壊;
終わり;
手順tsendthread.joke;
始める
終わり;
手順tsendthread.execute;
var
Theuser:Tuserinfo;
tmpsql:string;
始める
//タスクを実行します
//タイムリーな発行 '+gameInfo.mainusertable+'の処理
tmpsql:= 'select * from'+mainusertable+'ここで、destry = 0 order by id';
service1.adoquery_send.connection:= conn_server;
sqlquery(service1.adoquery_send、tmpsql);
while(service1.adoquery_send.eofではありません)と(終了していません)
始める
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;
終わり;
睡眠(600001);
Global_instance:= nil;
終了します。
//タスクが完了します
終わり;
終わり。