دلفي 的线程类
猛禽[الاستوديو العقلي]
http://mental.mentu.com
之五(大结局)
قم باختيار CheckSynchronize، اتبع الخطوات التالية:
وظيفة CheckSynchronize(Timeout: Integer = 0): Boolean;
فار
سينكبروك: بسينكبروك؛
قائمة LocalSync: TList؛
يبدأ
إذا كان GetCurrentThreadID <> MainThreadID ثم
رفع EThread.CreateResFmt(@SCheckSynchronizeError, [GetCurrentThreadID]);
إذا المهلة> 0 ثم
WaitForSyncEvent(مهلة)
آخر
ResetSyncEvent;
LocalSyncList := nil;
EnterCriticalSection(ThreadLock);
يحاول
Integer(LocalSyncList) := InterlockedExchange(Integer(SyncList), Integer(LocalSyncList));
يحاول
النتيجة:= (LocalSyncList <> nil) و (LocalSyncList.Count > 0)؛
إذا كانت النتيجة بعد ذلك
يبدأ
بينما LocalSyncList.Count > 0 افعل
يبدأ
SyncProc := LocalSyncList[0];
LocalSyncList.Delete(0);
LeaveCriticalSection(ThreadLock);
يحاول
يحاول
SyncProc.SyncRec.FMethod;
يستثني
SyncProc.SyncRec.FSynchronizeException := AcquireExceptionObject;
نهاية؛
أخيراً
EnterCriticalSection(ThreadLock);
نهاية؛
SetEvent(SyncProc.signal);
نهاية؛
نهاية؛
أخيراً
LocalSyncList.Free;
نهاية؛
أخيراً
LeaveCriticalSection(ThreadLock);
نهاية؛
نهاية؛
الآن، قد يكون هذا هو السبب في أن هذا هو ما يجعل الأمر صعبًا للغاية.
قم بتعيين ResetSyncEvent (تم تحديد موعد SetSyncEvent، ثم قم بتشغيل WaitForSyncEvent، وقم بإيقافه) يستخدم نظام التشغيل Linux نظام CheckSynchronize، ويعتمد Windows على نظام CheckSynchronize.
قائمة المنتجات الخاصة بـ SyncList: قائمة المنتجات الجديدة لا داعي للقلق بشأن هذا الأمر. لا داعي للقلق بشأن هذه المشكلة، قد لا يكون الأمر كذلك بالنسبة لك.
قم باختيار قائمة LocalSyncList الخاصة بـ SyncList، وحدد موقع SyncList: أنا تم إنشاء nterlockedExchange.
قم بإنشاء قائمة LocalSyncList، وحدد ما يجب عليك فعله تم إنشاء قائمة جديدة. تم إنشاء قائمة LocalSyncList هنا.
再来看对同步方法的处理:الحصول على أفضل النتائج (الحصول على أفضل النتائج) لا يوجد سبب آخر لذلك.
لا داعي للقلق بشأن هذا الأمر.
لا داعي للقلق بشأن هذا الأمر.
تم إنشاء هذا الحدث من خلال SetEvent، وهو ما يمثل تحديًا كبيرًا، وهو ما يجعل الأمر أكثر صعوبة. انقر فوق "مزامنة" WaitForSingleObject "".
في هذه الحالة، تحتاج إلى مزامنة كل ما تحتاج إليه.
هذا هو ما ينتظرك في انتظارك.
وظيفة TThread.WaitFor: LongWord؛
فار
H: صفيف [0..1] من Thandle؛
نتيجة الانتظار: الكاردينال؛
رسالة: TMsg؛
يبدأ
H[0] := FHandle;
إذا كان GetCurrentThreadID = MainThreadID إذن
يبدأ
انتظر النتيجة := 0;
H[1] := SyncEvent;
يكرر
{ يؤدي هذا إلى منع حدوث حالة توقف تام محتملة إذا كان مؤشر الترابط في الخلفية
يقوم بإرسال رسالة إلى سلسلة المحادثات الأمامية }
إذا كان WaitResult = WAIT_OBJECT_0 + 2 إذن
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);
WaitResult := MsgWaitForMultipleObjects(2, H, False, 1000, QS_SENDMESSAGE);
CheckThreadError(WaitResult <> WAIT_FAILED);
إذا كان WaitResult = WAIT_OBJECT_0 + 1 إذن
CheckSynchronize;
حتى WaitResult = WAIT_OBJECT_0؛
end else WaitForSingleObject(H[0], INFINITE);
CheckThreadError(GetExitCodeThread(H[0], Result));
نهاية؛
تم إنشاء خيار "الانتظار" من خلال "الانتظار" و"الانتظار لكائن واحد" وهو "المقبض" الذي تم الإشارة إليه.
如果是在主线程中执行WaitFor则比较麻烦.首先要在Hand Le 数组中增加一个SyncEvent، 然后循环等待،直到线程结(تم حذف MsgWaitForMultipleObjects من WAIT_OBJECT_0، ويتم استخدام MSDN في واجهة برمجة التطبيقات API).
أفضل ما في الأمر هو أن كل ما عليك فعله هو PeekMes حكيم 取出此消息(但并不把它从消息循环中移除),然后调用M sgWaitForMultipleObjects قم بالتعامل مع المقبض أو SyncEvent أو الإشارة الموضحة تم إرسال رسالة نصية (QS_SENDMESSAGE إلى عنوان البريد الإلكتروني الخاص بـ MSDN) . dleWaitForSingleObject. قم بتعيين SyncEvent وSetEvent(اطلب WAIT_OBJECT_0) + 1)، قم بإجراء التحقق من المزامنة في أي وقت.
يجب أن يكون لديك خيار الانتظار للحصول على رسالة MsgWaitForMultipleObjects، أو الانتظار للحصول على يجب أن يتم تنفيذ الانتظار لكائن واحد. قم بتشغيل مزامنة المزامنة، وقم بإيقاف تشغيل برنامج WaitForSin تم إنشاء gleObject بواسطة gleObject، لا داعي للقلق بشأن هذا الأمر.
قد يؤدي الانتظار لكائنات متعددة إلى حدوث خطأ. قم بالتعامل مع SyncEvent من خلال الإشارة إلى الحدث الذي تم إجراؤه بواسطة QS_SEND تعمل الرسالة على مزامنة كل ما تحتاج إليه من معلومات، وتتيح لك الحصول على مزيد من المعلومات. قم بمزامنة المزامنة في أسرع وقت ممكن هذا هو السبب في أن هذا هو ما يجعل الأمر أكثر صعوبة.
هذا هو السبب وراء نجاح TThread في تحقيق أفضل النتائج:
1 、 قم بتنفيذ الأمر بنجاح يمكن أن يكون هذا أمرًا رائعًا منتفخ 标志的判断،并及时退出. "هذا هو السبب في أن هذا هو السبب وراء الحاجة إلى استخدام واجهة برمجة التطبيقات (API) أو RTL."
2、يقوم برنامج VCL بمزامنة المزامنة، ويتيح لك إجراء عملية المزامنة.
3、 قم بإجراء مزامنة البيانات مع مزامنة البيانات.
4. قم بإيقاف تشغيل الحدث (إيقاف مؤقت/استئناف).
5、الحصول على أفضل النتائج هو الحصول على أفضل النتائج.
6、انتظر الآن.
01-03 ديسمبر
(终于续完了)