الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

البرمجة متعددة المهام أو Multitasking

مغلق
بدأه neoo في 21 يناير 2001 · 11 رد · 9,337 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ،،،

يا شباب ممكن واحد يتكرم ويشرح عن الثريد thread، و عن مسئلة الملتي تاسكينقك multitask في البرنامج،، ووش تفيدني في اليرنامج ؟

شكرا للجميع

#2

الموضوع رائع والشرح فيه يطول ::-

في بيئة ويندوز-32 أو Win32 فإن كل تطبيق محمل يتكون من مهمة واحدة أو Process ومن واحد أو أكثر من Thread ، إن Thread بترجمتها الحرفية إلى العربية تعني مسلك (طريق) . أما تعريفها العلمي فهي طريق تنفيذ التعليمات بالإضافة إلى مجموعة من الموارد التي يعطيها لها النظام كحالة المسجلات والمكدس ، وغيرها الكثير . وبسهولة أكثر إعتبرها شيفرة يراد تنفيذها ..

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

حسنا تعدد سلوك التنفيذ أو ال Multithreading ليست سهلة المتناول لأي كان . إن من أصعب البرامج كتابة و تنقيحا هي هذه البرامج ، وهذا كله يعود بسبب التوازي في عمل الشيفرة التي تضع طبقة إضافية من الصعوبة على البرنامج المنفذ. ولكن مع الخبرة والدقة في البرمجة فإنها يمكن أن تقوم بتحسين أداء البرنامج وإستجوابية البرنامج . للتوضيح أطرق المثال التالي : لنأخذ مثالا محرر النصوص مايكروسوفت وورد ، نلاحظ أن هذا المحرر يقوم في الخلفية بالتأكد من الإملاء وفي نفس الوقت ينفذ الرسائل القادمة إلى الثريد الأساسي كتنفيذ رسالة WM_CHAR من أجل معالجة ضغطات المستخدم . للوهلة الأولى نجد أنه من السهولة برمجة وظيفتين أحدهما التدقيق الإملائي والأخرى هي برنامج التحرير نفسه يعملا في نفس الوقت (فهذا هو المنطقي؟؟) . ولكن ماهو الذي يجعل كتابة مثل هذا المحرر صعبا بعض الشئ . يجب على مدقق الإملاء هذا أن يواقت مهامه مع بقية الوظائف الاخرى في البرنامج ، كيف يحدث هذا؟ كلنا عند البرمجة نقوم بكتابة الكود كالتالي على سبيل المثال : تابع A يستدعي تابع B وهذا يستدعي تابع C ثم هذا الأخير يعود ويستدع A وهكذا حتى إنتهاء البرنامج .. (وإن كنت تحسب أن البرمجة المقادة بالأحداث هي غير ذلك ، فأنت مخطئ فهي تماما كتلك ..!!) . أما في برامج ال Multithreading ، وبما أن ال Threads تعمل في نفس الوقت ، فيجب أن تفكر ماذا سوف يحدث إن إستدعى طريقين تنفيذين أو two threads تابع B في نفس الوقت . أو ماذا يحدث إذا كان thread يقرأ متحول ما A و Thread آخر يقوم بالكتابة على هذا المتحول ؟؟ (ممتع ها!)

كما يبدو، هناك عدة توابع API مختصة بالتعامل مع ال Thread ، وقامت MFC بالإلتفاف حول هذه التوبع .. وبالحديث عن الMFC فإن أشهر توابع الثريد هو AfxBeginThread ويوجد نوعان في الثريد تحت منظور الMFC :

1) Worker Thread : وهو الذي يقوم بأعمال في الخلفية كالعمليات الحسابية ..

2) User Interface Thread : وهو مثل النوع الأول ولكن يختلف عنه أن هذا الثريد يقوم بإنشاء نافذة وينفذ الرسائل القادمة من الويندوز .. والنوع الثاني يمكن إستخدامه عن طريق CWinThread . في الحقيقة فإن الصنف الأساسي في برنامجك في ال MFC هو CWinApp الذي هو بدوره مووروث من CWinThread . وهذا يؤكد ما ذكرته سابقا أنه يوجد Thread أساسي في أي برنامج ويندوز .

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

CCriticalSection : ومن إسمها يعني المنطقة الخطرة ، أو مقطع المعطيات أو الشيفرة المعرض للوصول من أكثر من ثريد.

CMutex و CEvent وهما مشابهان لعملهما الصف السابق .

CSemaphore : وهو يسهل عملية التعامل مع الأجهزة المحدودة المداخل والخارج بفعالية .. فعلى سبيل المثال ليكن لدينا منفذ خرج ما يحتوي على 10 bin أو رجل .. ولدينا أيضا 20 وظيفة تريد أن تتشارك في إخراج المعلومات على هذه الأرجل العشر ، وبالتالي بوضع العشرين وظيفة في Threads منفصلة واستخدام CSemaphore في التحكم بعملها . فإنه نلاحظ أنه يتحكم بها كالتالي يقوم Semaphore بتشغيل 10 ثريد . وإذا أنهى واحد منها عمله ، أي أصبح لدينا 9 يعملون . يقوم Semaphore بتشغيل الوظيفة الحادية عشرة بشكل أوتامتيكي ، وهكذا حتى تنتهي العشرون وظيفة من وظائفها ...

هذا الكلام يبدو صعب للوهلة الأولى لكن مع الممارسة سوف تجد نفسك تستخدم الثريد في كل برنامج تكتبه .. فهناك العديد من البرامج تتعامل ك Multithreaded ، سوف أذكر بعض الأمثلة عليها :

* برنامج الوورد كما ذكرت سابقا

* برنامج 3-دي ماكس في عملية الإكساء أو Rendering يقوم بتشغيل ثريد منفصل .

* العديد من برامج محرر الصور كالفوتو شوب ، كمعالجة الصور في الخلفية .

* برامج الداتابيس ومن بينها ال SQL حيث يقوم بإنشاء ثريد منفصل لكل طلب أو Query من أجل البحث أو الإدخال .

يمكنك أيضا أن تصنع برامج Multithreading بسيطة تقوم بمقارنة كفائة خوارزميتين ، حيث ترى نتائج التنفيذ على الشاشة في نفس وقت تنفيذ الخوارزميتين ، ومثال على هذا برنامج يقوم بعرض طرق الترتيب الثلاث : الترتيب السريع Quick Sort ، الترتيب بالإختيار Selection Sort ، الترتيب الفقاعي Bubble Sort ، ويقوم البرنامج بترتيب عناصر مصفوفة في نفس الوقت وترى النتائج أثناء الترتيب على الشاشة وملاحظة الأسرع .

لقد برمجت أيضا برنامج يقوم بعرض التدرج بين عدة صور أي ينتقل من الصورة الأولى إلى الثانية تدريجيا (Fade-in Fade-out) . ووضعت كود مسؤول عن تنفيذ الخوارزمية باستخدام ال MMX في تابع وتابع آخر ينفذ الخوارزمية ولكن بشكل عادي (Scaler Code) . ثم قمت بقدح الكودين في نفس الوقت (حيث كل واحد في ثريد منفصل) . وكل ثريد يرسم على الشاشة الصورة الناتجة من تنفيذ الخوارزمية ، ولاحظت فرق السرعة في كود ال MMX عن العادي ..

ماكنت أريد أن ينتهي حديثي هكذا بدون شرح أكثر على أمثلة عملية توضح ماقلته ، ولكن حتى لا أطيل عليكم . ولكني جاهز إذا طلبتم المزيد ولكن فقط في الفيجوال سي ... إن ال Multithreading أيضا يمكن برمجتها بالفيجوال بيسك (ولكني بصراحة لا أعرف فيجوال بيسك!) ...

Coding on the Cloud and for the Cloud!

My Blog

#3

ينصر دينك كذا الشرح ولا يلاش واشكرك من كل اعماق قلبي

جديد مدونتي الشخصية http://www.badwi.com

ادعو لنا بظاهر الغيب

MyBooksExchange.jpg

#4

و الله مدري وش اقول ،،،، شكرا جزيلااااااا و تسلم على هذا الشرح البسيط الحلو بصراحة تستحق لقب ملك ++VC وبكل جدارة ،،،

على فكرة ،، ليش ما تألف كتاب ؟

تقبل شكري وتحياتي ،،

#5

اخ هاني بارك الله فيك، بما انك ممتاز في هذه المواضيع الشيقة التي لا يتحدث عنها احد في المواقع العربية ، ولو تزيد شويا وتشرح لنا موضوع إدارة الذاكرة من قبل نظام التشغيل، كما تشرح لنا عملية القفل الميت did lock اكثر ، وياريت تكملة بموضوع ادارة الملفات في نظم التشغيل اعتقد فهمت القصد File allocation table وكيفية تقسيمه وتوزيعها على القرص الصلب، بصراحة درست هذه المواضيع سابقا وكان استادنا الفاضل هو نفسه مش فهمها كويس كيف حا تتوقعنا نكون فيها ، اعرف انها مواضيع ممتازة جدا وحولنا فيا جهدنا ولكن قلة الكتب العربية والمواقع يلي تتحدث عن هذه المواضيع منعنا من زيادة المعرفة بمثل هذه المواضيع يلي تهم جميع المبرمجين، وياريت يكون في موضوع دروسك القادمة والتي انتظرها بفارغ الصبر في الفيجول سي ++ حول هذه المواضيع ووغيرها من المواضيع الهامة، هذا ليش انا اتمنى اتعلم الفيجول سي ++ حتى نقوم بإجراء عمليات برمجية قوية على السيستيم

لا اريد اكثر عليك اخ هاني ولكن عندي لك سوال شخصي هل انت استاد مادة نظم تشغيل Operating System .؟

اخ محمد البدوي مدير الموقع ارجو منك وضع هده المقالة او الموضوع كا صفحة ثابتة بالموقع حتى يستفيد منها كل زوار هذا الموقع وحتى لو كانت زيارتهم بعد عام، فالمقالات الممتازة متل هذه ممكن ان تختفي من المنتدى بعد فترة

لا يتعلم العلم كل مستحي او مستكبر

#6

أشكركم جميعا، أخي محمد، أخي نيوو ، و الأخ طارق :)

فعلا لقد أزدموني حماسا، وأنا أشكركم على إظهار إهتمامكم وحماستكم على الموضوع .

أخي نيوو،

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

أخي طارق،

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

وشكرا،

Coding on the Cloud and for the Cloud!

My Blog

#7

أخ طارق

أترك موضوع File Allocation Table لي أنا، خلي هاني يستغرق في برمجته الإحترافية..

إن شاء الله سوف أكتب لكم درس مفصل في هذا الموضوع (في 1 بالشهر بعد إمتحاني :( )

والشكر الجزيل للصديق هاني على هذا المجهود الرائع منه

#8

السلام عليكم

وجدت الموضوع جميل ومفيد

فقلت نرفعه للفائده

تحياتي

#9

شكرا لك اخ MLN4EVER انا وجدت الموضوع شيق جدا لاني اريد تعلم ال MultiThreading والتعمق اكثر في الحاسوب... وخسارن ان الاخ هاني ليس موجودا على المنتدى هذه الايام :(

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#10

شكرا للاستاذ هاني على هذا الشرح ولو كنت كنت تتصفح المنتدى هذه الأيام أتمنى منك اصافة أمثلة (أكواد)

مع ان الموضوع يبدو انه مكتوب منذ فترة كبيرة ولكنني أتمنى أن يكون الأستاذ هاني موجود

وشكرا

abofahad5515@hotmail.com

#11

مشكــــــــــــــ مشكورــــــــــــــــــــــ مشكورــــــــــــــــور

أخ هاني

على هذا الشرح والله يعطيك العافية

انت عامل مثال وهو الترتيب "أنا اعرف كيفية الترتيب " بس ما عرفت كيف أعملهم في برنامج multithreading يا ريت توضح كيفية بناء برامج multithreading بشكل عام وبناء برنامج الترتيب بالأخص

اذا كان الاستاذ هانى موجود

يا ريت ترد على الايميل بأسرع وقت ممكن

ومشكور على هذا الجهد

#12

للرفع,,

الموضوع جميل جداً ,,

هذا الموضوع مغلق.

مواضيع مشابهة