متعدد العمليات إنهاء مؤشرات الترابط

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

  • إنهاء مؤشر ترابط عادي

  • إنهاء مؤشر ترابط قبل أوانه

  • استرداد تعليمة الخروج البرمجية لمؤشر ترابط

إنهاء مؤشر ترابط عادي

فى حالة مؤشر ترابط عامل, إنهاء مؤشر ترابط عادي عملية بسيطة: قم بالخروج من الدالة المتحكمة ثم قم بإرجاع قيمة تشير إلى سبب الإنهاء. يمكنك استخدام إما دالة AfxEndThread أو عبارة return . عادةً، 0 يعنى إكمال ناجح, ولكن هذا يرجع لك.

فى حالة مؤشر ترابط واجهة المستخدم ، تكون العملية بنفس البساطة: من خلال مؤشر ترابط واجهة المستخدم ، استدع PostQuitMessage فى Windows SDK. المعلمة الوحيدة التى تأخذها PostQuitMessage هى تعليمة الخروج البرمجية لمؤشر الترابط. بالنسبة لمؤشرات الترابط العاملة، 0 عادةً تعني إكمال ناجح.

إنهاء مؤشر ترابط قبل أوانه

إنهاء مؤشر ترابط قبل الأوان هو تقريباً بنفس البساطة: استدع AfxEndThread من داخل مؤشر الترابط.. قم بتمرير تعليمة الخروج البرمجية المطلوبة على أنها المعلمة الوحيدة. هذا يقوم بإيقاف تنفيذ مؤشر الترابط ,و يقوم بإلغاء مكدس مؤشر الترابط , و يفصل جميع الـ DLLs المرفقة بمؤشر الترابط ،و يحذف كائن مؤشر الترابط من الذاكرة.

يجب استدعاء AfxEndThread من داخل مؤشر الترابط ليتم إنهاؤه. إذا كنت تريد إنهاء مؤشر ترابط من مؤشر ترابط أخر, يجب عليك إعداد أسلوب اتصال بين مؤشرى الترابط .

استرداد تعليمة الخروج البرمجية لمؤشر ترابط

للحصول على تعليمة الخروج البرمجية لكل من مؤشر ترابط العامل أو مؤشر ترابط واجهة المستخدم ، استدع دالة GetExitCodeThread للحصول على معلومات حول هذه الدالة ، راجع Windows SDK. هذه الدالة تأخذ المؤشر(handle) إلى مؤشر الترابط (يتم تخزينها في عضو بيانات m_hThread الخاص بكائنات CWinThread ) وعنوان الـ DWORD.

إذا كان مؤشر الترابط لا يزال فعالاً GetExitCodeThread يضع STILL_ACTIVE في عنوان DWORD المزود ; وإلا, يتم وضع تعليمة الخروج البرمجية في هذا العنوان.

استرداد تعليمة الخروج البرمجية لكائنات CWinThread يحتاج خطوة إضافية. بشكل افتراضي، عندما ينتهى مؤشر ترابط CWinThread ، يتم حذف كائن مؤشر ترابط . وهذا يعني أنه لا يمكنك الوصول إلى بيانات عضو الـ m_hThread لأن كائن الـ CWinThread لم يعد موجوداً. لتجنب هذا الموقف , قم بأحد الإجراءات التالية:

  • قم بتعيين عضو بيانات m_bAutoDelete إلى FALSE . هذا يسمح لكائن CWinThread بالبقاء بعد إنهاء مؤشر الترابط . يمكنك عندها الوصول إلى عضو بيانات الـ m_hThread بعد إنهاء مؤشر الترابط . إذا قمت بإستخدام هذه التقنية , على الرغم من ذلك ، تعتبر مسؤولاً عن تدمير كائن الـ CWinThread لأن إطار العمل لن يقوم بحذفه لك تلقائياً . هذا هو الأسلوب المفضل.

  • قم بتخزين مؤشر(handle) مؤشر الترابط بشكل منفصل. بعد إنشاء مؤشر الترابط , قم بنسخ عضو البيانات m_hThread الخاص به (باستخدام :: DuplicateHandle ) إلى متغير آخر و قم بالوصول إليه من خلال هذا المتغير. بهذه الطريقة يتم حذف الكائن تلقائياً عند الإنهاء ويكون لازال يمكن معرفة سبب إنهاؤه. كن حذراً ألا ينتهي مؤشر الترابط قبل أن يمكنك تكرار المؤشر. الطريقة الأكثر أماناً للقيام بذلك هي تمرير CREATE_SUSPENDED إلى AfxBeginThreadو تخزين المؤشر ثم استئناف التنفيذ عن طريق استدعاء ResumeThread .

يتيح كلا الأسلوبين تحديد سبب إنهاء الكائن CWinThread.

راجع أيضًا:

المرجع

_endthread _endthreadex

_beginthread _beginthreadex

ExitThread

المبادئ

تعدد العمليات بـ ++C و MFC