تم إهمال TThread.resume في دلفي 2010، ما الذي يجب استخدامه في مكانه؟

StackOverflow https://stackoverflow.com/questions/1418333

  •  07-07-2019
  •  | 
  •  

سؤال

في تطبيقي متعدد المواضيع

أنا أستعمل TThread.suspend و TThread.resume

منذ نقل طلبي إلى دلفي 2010، تلقيت الرسالة المتحاربة التالية

[تحذير DCC] xxx.pas(277):تم إهمال رمز W1000 "السيرة الذاتية".

إذا تم إهمال السيرة الذاتية، فما الذي يجب استخدامه في مكانه؟

تحرير 1:

انا استعمل ال سيرة ذاتية الأمر لبدء مؤشر الترابط - كما تم إنشاؤه مع تعيين "CreateSuspending" على True و تعليق قبل أن أنهي الموضوع.

تحرير 2:

وهذا رابط دليل دلفي 2010

هل كانت مفيدة؟

المحلول

تشارلز إذا قرأت كود فئة TThread فهل تجد الإجابة.

   TThread = class  
   private type  

..
..
..   
   public  
     constructor Create(CreateSuspended: Boolean);  
     destructor Destroy; override;  
     procedure AfterConstruction; override;  
     // This function is not intended to be used for thread synchronization.  
     procedure Resume; deprecated;  
     // Use Start after creating a suspended thread.  
     procedure Start;  
     // This function is not intended to be used for thread synchronization.  
     procedure Suspend; deprecated;  
     procedure Terminate;  

انظر هذا الرابطhttp://wings-of-wind.com/2009/08/28/rad-studio-2010-community-pulse-the-day-after-part-2/

يحرر:

إذا كنت بحاجة إلى مزامنة المواضيع، فيمكنك استخدام مخطط يعتمد على TMutex وTEvent والأقسام الهامة.

الوداع.

نصائح أخرى

استخدم TThread.Start بدلاً من .Resume

-لا يمكن استخدام البدء بالطبع إلا مع Delphi 2010 (وبعد ذلك ، من المفترض) لبدء خيط تم تعليقه (حيث كنت قد استخدمت الاستئناف من قبل).

لا يوصى باستخدام Resume/Suspend (أو وظائف WinAPI المقابلة) لمزامنة مؤشر الترابط.انظر المناقشة هنا (ألق نظرة على تعليقات باري كيلي).

تعليق و سيرة ذاتية كانت (أو كانت في السابق) من المحتمل أن تكون مكسورة في TThread فئة (إذا نظرت إلى المصدر سترى أن طريقة Suspend تقوم مباشرة ودون قيد أو شرط بتعيين قيمة منطقية إلى حالة تعليق مؤشر الترابط المشار إليه بدلاً من اشتقاق هذه الحالة بقوة أكبر من عدد التنفيذ على مقبض مؤشر الترابط.ومن المفارقات أن سيرة ذاتية تستخدم الطريقة هذا المؤشر الأكثر قوة تحديث الحالة المعلقة منطقية).

ربما هذا هو سبب إهمالهم.ولهذا السبب أيضًا قمت بتنفيذ فصلي الخاص لتغليف سلسلة رسائل Windows بآلية تعليق واستئناف أكثر قوة بالإضافة إلى القدرة على إعادة تشغيل موضوع بمجرد الانتهاء منه.

لست متأكدًا من سبب ارتباط إهمالهم بالمزامنة.تعليق واستئناف المواضيع لا يرتبط بالضرورة بالمزامنة، على الرغم من أنني أستطيع أن أرى كيف يمكن أن يكون الأمر.من المثير للاهتمام ملاحظة أن الأساليب المكافئة في فئة .NET Framework Thread تم تصنيفها بالمثل على أنها قديمة.وتظهر نفس التعليقات مع مزامنة w.r.t في وثائق Windows API لتعليق/استئناف مؤشر الترابط.

إذا كان استخدام الأساليب المهملة يجعلك متوترًا وما زلت ترغب في التعليق/الاستئناف، فيمكنك دائمًا استخدام Windows API للقيام بذلك قم بتعليق واستئناف مؤشر الترابط بالرجوع إلى المقبض الخاص به.

يجب أن يكون رمز التحكم في سلوك الخيط موجودًا في إجراء الخيط.استخدم كائنات المزامنة المناسبة واستدعاءات واجهة برمجة التطبيقات (API) المقابلة لتعليق/استئناف تنفيذ سلسلة الرسائل.إن القيام بذلك من الخارج هو ممارسة خطيرة.لذلك كان هناك قرار بتدميرها.

فقط في حالة أن كل ما أردت فعله هو التخلص من تلميحات المترجم

(1) للتخلص من تلميح المترجم متى بدء الموضوع ...

يستبدل

MyThread := TMyThread.Create(True);
MyThread.Resume;

مع

MyThread := TMyThread.Create(True);
MyThread.Start;

(2) للتخلص من تلميح المترجم متى وقف الموضوع ...

يستبدل

MyThread.Suspend;
MyThread.Terminate;

مع

MyThread.Terminate;

ليس أمرا مهما على أي حال.احترس من محاولة التشويش.

يجب عليك إنشاء الموضوع على النحو التالي:

constructor TSignalThread.Create;
begin
 // create event handle first!
  FEventHandle := CreateEvent(
          {security}      nil,
          {bManualReset}  true,
          {bInitialState} false,
          {name}          nil);
  FWaitTime := 10;
  inherited Create({CreateSuspended}false);
end;

بهذه الطريقة لا يلزم الاتصال بـ Start.

يرى http://www.gerixsoft.com/blog/delphi/creating-threads للحصول على شرح لماذا يعمل هذا الرمز.

يستخدم

Suspended := False; // Resume;

أو

Start;

@mghie (متأخراً قليلاً، أعلم)

خذ على سبيل المثال madexcept وعلى حد سواء.إذا تعطل تطبيقك وتم عرض تقرير خطأ للمستخدم، فهذا يعني أن مربع الحوار ينتظر إدخال الاستخدام.إذا حدث أن التعطل كان نتيجة لإجراء سلسلة رسائل (ليس بالضرورة تعطل سلسلة الرسائل)، إذا لم تقم بتعليق سلاسل الرسائل، فسيتم ملء الشاشة بمربعات حوار تقرير الأخطاء.

مثال 2:تسجيل.لأي سبب معين، كنت على الأقل بحاجة إلى تسجيل حالة تنفيذ بعض سلاسل الرسائل.يتضمن ذلك تتبع المكدس الحالي.الآن، كما (يجب) أن تعلم، لا يمكنك القيام بذلك أثناء تشغيل سلسلة المحادثات لأنه خلال الوقت الذي تجمع فيه معلومات حوله، تستمر سلاسل الرسائل في القيام بالأشياء، لذا بحلول الوقت الذي تنتهي فيه من التجميع، لن تكون المعلومات التي تم جمعها متسقة.وبالتالي، تحتاج إلى تعليق الموضوع.

ويمكنني الاستمرار في تقديم أمثلة عملية حول إدارة سلاسل الرسائل.من المؤكد أن هذه ليست أشياء تفعلها في البرمجة اليومية، ولكن على الأقل المثال الأول أنا متأكد من أن الكثير منكم يستخدمه، حتى لو لم تكن على علم بالأجزاء الداخلية منه.المصححين؟مرة أخرى، يمكنك استخدامها.ولكن في الواقع، في كل هذه الحالات، لا يتم استخدام TThread، حيث يتم العمل على مقابض الخيوط.لذلك، في الواقع، من الصعب الحصول على مثال صالح لاستخدام تعليق TThread.ولكن المواضيع بشكل عام، تلك قصة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top