Mode singleton digunakan untuk membatasi hanya satu objek dari kelas tertentu dalam prosesnya. ), jika kedatangan menghasilkan utas, tetapi jika jam lain tercapai sebelum utas ini menyelesaikan tugasnya, itu dapat menghasilkan banyak utas untuk menjalankan tugas, menghasilkan kebingungan, jadi pertimbangkan untuk menggunakan mode singleton untuk menyelesaikan masalah ini (tentu saja ada yang lain Solusi., Tapi contoh ini menggunakan singleton).
Kode inti adalah sebagai berikut:
// unit timer
Prosedur TService1.Timer_Maintimer (pengirim: Tobject);
var
MyStringList: TStringList;
SearchRec: TSearchRec;
sekarang waktu: string;
Mulai
mencoba
DateTimetoString (sekarang waktu, 'hh: nn', sekarang);
jika leftstr (sekarang waktu, 4) = leftstr (getMsg ('game', 'waktu penerbitan', TheExename+'. Ini'), 4) lalu
Mulai
// Buat utas pengiriman
Global_instance: = tsendThread.getInstance;
PERBICUPANI////////////////////////////////////////////
akhir;
kecuali
pada e: pengecualian lakukan
Mulai
myStringList: = tStringList.create;
Jika FileExists (ExtractFilePath (paramStr (0))+'err.txt') lalu
myStringList.LoadFromFile (ExtractFilePath (paramstr (0))+'err.txt');
myStringList.add ('('+DatetimetoStr (sekarang)+') [kesalahan membuat utas:]'+e.message);
myStringList.savetofile (extractFilePath (paramstr (0))+'err.txt');
mystringlist.free;
Jika FindFirst (ExtractFilePath (paramstr (0))+'err.txt', faanyfile, searchRec) = 0 lalu
Mulai
Jika searchRec.Size> 5000000 lalu
Mulai
RenameFile (ExtractFilePath (paramstr (0))+'err.txt', ansireplacestr (extractFilePath (paramstr (0))+'err.txt', '. Txt', formatDateTime ('yyyy-mm-dd hh-mm-ss ', sekarang)+'. txt '));
akhir;
akhir;
akhir;
akhir;
akhir;
// Unit Thread
unit unit_send;
antarmuka
penggunaan
Sysutils, kelas, strutils, utama;
jenis
TsendThread = class (tThread)
publik
Konstruktor Create (CreateSeSeSePended: Boolean);
Destructor menghancurkan;
Fungsi kelas getInstance: tsendthread;
lelucon prosedur;
terlindung
Prosedur Eksekusi;
akhir;
var
Global_instance: tsendthread;
Pelaksanaan
menggunakan db;
fungsi kelas tsendThread.getInstance: tsendThread;
Mulai
jika global_instance = nil lalu
Mulai
Global_instance: = tsendThread.create (false);
akhir;
Hasil: = Global_instance;
akhir;
konstruktor tsendthread.create (createSupended: boolean);
Mulai
jika global_instance = nil lalu
Mulai
warisan create (createsUspended);
Freeonterminate: = true;
akhir
kalau tidak
Naikkan Exception.createFmt ('tidak dapat membuat lebih dari satu instance tsendthread!', [SyserrorMessage (0)]));
akhir;
Destructor tsendthread.destroy;
Mulai
warisan warisan;
akhir;
prosedur tsendthread.joke;
Mulai
akhir;
Prosedur tsendThread.Execute;
var
Pusat: Tuserinfo;
tmpsql: string;
Mulai
// Jalankan tugas
// Memproses penerbitan tepat waktu '+GameInfo.MainUserTable+'
tmpsql: = 'pilih * dari'+MainUserTable+'Where Destroy = 0 Order by Id';
Service1.adoquery_send.connection: = conn_server;
SqlQuery (service1.adoquery_send, tmpsql);
while (bukan service1.adoquery_send.eof) dan (tidak diakhiri) lakukan
Mulai
TheUser.seqid: = '0';
TheUser.uid: = '';
TheUser.spc: = getMsg ('parameter', 'spcode', TheExename+'. Ini');
TheUser.Recordid: = '0';
theUser.mob: = service1.adoquery_send.fieldbyname ('seluler'). astring;
Autojoke (Pusat);
Service1.adoquery_send.next;
akhir;
Tidur (600001);
Global_instance: = nil;
Mengakhiri;
// Tugas selesai
akhir;
akhir.