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

‏‫مؤشر ترابط عامل شائعة الاستخدام لمعالجة مهام في الخلفية لا يجب أن يكون على المستخدم انتظارها لمتابعة استخدام التطبيق الخاص بك. المهام مثل إعادة الحساب و الطباعة في الخلفية أمثلة جيدة لمؤشر ترابط عامل. يُفصّل هذا الموضوع الخطوات الضرورية لإنشاء مؤشر ترابط عامل. تتضمن المواضيع:

  • بدء تشغيل مؤشر الترابط

  • تطبيق الدالة المتحكمة

  • المثال

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

بدء تشغيل مؤشر الترابط

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

  • عنوان الدالة المتحكمة.

  • المعلمة التي يجب إرسالها إلى الدالة المتحكمة.

  • (اختياري) أولوية مؤشر الترابط المطلوبة. الافتراضي هو أولوية عادية. للحصول على مزيد من المعلومات حول مستويات الأولوية المتوفرة، راجع SetThreadPriority في Windows SDK.

  • (اختياري) حجم المكدس المطلوب لمؤشر الترابط. الافتراضي هو نفس حجم مكدس مثل مؤشر الترابط المنشيء.

  • (اختياري) create_suspended إذا كنت ترغب في إنشاء مؤشر الترابط في حالة توقف مرحلي. القيمة الافتراضية هي 0 أو بدء مؤشر الترابط بشكل عادي.

  • (اختياري) سمات الأمان المطلوبة. الافتراضي هو نفس إمكانية الوصول كمؤشر الترابط الأصل. للحصول على مزيد من المعلومات حول تنسيق معلومات الأمان هذه، راجع SECURITY_ATTRIBUTES في Windows SDK.

AfxBeginThread ينشئ و يهيئ الكائن CWinThread لك, ثم يرجع عنوان IP الخاص به بحيث يمكنك الرجوع له فيما بعد. يتم إجراء اختبارات خلال الإجراء للتأكد من أن كافة الكائنات تم إلغاء تخصيصها بشكل صحيح في حالة فشل أي جزء من الإنشاء.

تطبيق الدالة المتحكمة

تُعرّف الدالة المتحكمة مؤشر الترابط. عند إدخال هذه الدالة يبدأ مؤشر الترابط و عند الخروج منها ينتهي مؤشر الترابط. يجب أن يكون للدالة النموذج الأولي التالي:

UINT MyControllingFunction( LPVOID pParam );

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

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

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

مثال للدالة المتحكمة‬

يظهر المثال التالي كيفية تعريف الدالة المتحكمة‬ واستخدامها من جزء آخر من البرنامج.

UINT MyThreadProc( LPVOID pParam )
{
    CMyObject* pObject = (CMyObject*)pParam;

    if (pObject == NULL ||
        !pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))
    return 1;   // if pObject is not valid

    // do something with 'pObject'

    return 0;   // thread completed successfully
}

// inside a different function in the program
.
.
.
pNewObject = new CMyObject;
AfxBeginThread(MyThreadProc, pNewObject);
.
.
.

ما الذى تريد معرفة المزيد حوله ؟

راجع أيضًا:

المبادئ

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