يتم استخدام وضع Singleton لتقييد كائن واحد فقط من فئة معينة في العملية. ) ، إذا قام الوافدون بإنشاء مؤشر ترابط ، ولكن إذا تم الوصول إلى ساعة أخرى قبل أن تكمل هذا الموضوع مهمته ، فقد يولد عدة مؤشرات ترابط لتنفيذ المهمة ، مما يؤدي الحلول.
الرمز الأساسي هو كما يلي:
// وحدة المؤقت
الإجراء tservice1.timer_maintimer (المرسل: tobject) ؛
var
MyStringList: TstringList ؛
SearchRec: tsearchrec ؛
الآن الوقت: سلسلة.
يبدأ
يحاول
datetimetoString (Nowtime ، 'hh: nn' ، الآن) ؛
إذا كان LeftStr (Nowtime ، 4) = LeftStr (getMsg ('Game' ، 'وقت الإصدار' ، 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 (الآن)+') [خطأ إنشاء مؤشر ترابط:]'+e.message) ؛
myStringList.savetofile (extractFilePath (paramstr (0))+'err.txt') ؛
MyStringList.free ؛
إذا findFirst (extractFilePath (paramstr (0))+'err.txt' ، faanyfile ، searchrec) = 0 ثم
يبدأ
إذا كان SearchRec.size> 5000000 ثم
يبدأ
RenameFile (extractFilePath (paramstr (0))+'err.txt' ، ansireplacester (extractFilePath (paramstr (0))+'err.txt' ، '. txt' ، formatDateTime ('yyyy-mm-dd hh-mm-ss '، الآن)+'. txt ')) ؛
نهاية؛
نهاية؛
نهاية؛
نهاية؛
نهاية؛
// وحدة الموضوع
الوحدة unit_send ؛
واجهة
يستخدم
sysutils ، الطبقات ، strutils ، الرئيسية ؛
يكتب
tsendthread = فئة (tthread)
عام
إنشاء مُنشئ (CreateSusused: Boolean) ؛
المدمرة تدمير.
وظيفة الفصل getInstance: tsendthread ؛
نكتة الإجراء
محمية
التنفيذ الإجراء ؛
نهاية؛
var
Global_instance: tsendthread ؛
تطبيق
يستخدم DB ؛
وظيفة فئة tsendthread.getInstance: tsendthread ؛
يبدأ
إذا global_instance = nil ثم
يبدأ
global_instance: = tsendthread.create (false) ؛
نهاية؛
النتيجة: = global_instance ؛
نهاية؛
مُنشئ tsendthread.create (CreateSusused: Boolean) ؛
يبدأ
إذا global_instance = nil ثم
يبدأ
إنشاء ورث (createSusused) ؛
FreeOnTerminate: = صحيح ؛
نهاية
آخر
قم برفع استثناء.
نهاية؛
Destructor tsendthread.destroy ؛
يبدأ
تدمير الموروث.
نهاية؛
الإجراء tsendthread.joke ؛
يبدأ
نهاية؛
الإجراء tsendthread.execute ؛
var
Theuser: TuserInfo ؛
TMPSQL: سلسلة ؛
يبدأ
// تنفيذ المهام
// معالجة الإصدار في الوقت المناسب '+gameinfo.mainusertable+'
TMPSQL: = 'SELECT * from'+mainusertable+'حيث تدمير = 0 order by id' ؛
service1.adoquery_send.connection: = conn_server ؛
sqlquery (service1.adoquery_send ، tmpsql) ؛
بينما (ليس Service1.adoquery_send.eof) و (لم يتم إنهاء) تفعل
يبدأ
theuser.seqid: = '0' ؛
theuser.uid: = '' ؛
theuser.spc: = getMsg ('المعلمة' ، 'spcode' ، theexename+'. ini') ؛
theuser.recordid: = '0' ؛
theuser.mob: = service1.adoquery_send.fieldbyname ('mobile'). assstring ؛
Autojoke (Theuser) ؛
service1.adoquery_send.next ؛
نهاية؛
النوم (600001) ؛
global_instance: = nil ؛
إنهاء ؛
// تم الانتهاء من المهمة
نهاية؛
نهاية.