برمجة مبنية على الأحداث

في برمجة الكمبيوتر ، تُعرف **البرمجة الموجهة بالأحداث (event-driven programming)** نموذج برمجة يتم فيه تحديد سير البرنامج بواسطة **أحداث خارجية**. تشمل الأمثلة الشائعة لهذه الأحداث مدخلات واجهة المستخدم من الفئران،ولوحات المفاتيح، ولوحات اللمس، وشاشات اللمس، بالإضافة إلى مدخلات المستشعرات الخارجية. يمكن أيضًا إنشاء الأحداث برمجيًا، مثل الرسائل القادمة من برامج أخرى، الإشعارات من خيوط تنفيذ أخرى، أو أحداث الشبكة المتنوعة.

ان البرمجة الموجهة بالأحداث هي النموذج السائد المستخدم في تطبيقات واجهات المستخدم الرسومية وخوادم الشبكة .

في التطبيقات التي تعتمد على الأحداث، عادةً ما توجد  تستمع للأحداث، ثم تقوم بتشغيل **وظيفة استدعاء (callback function)** عند اكتشاف أي من هذه الأحداث.

يمكن كتابة البرامج التي تعتمد على الأحداث بأي لغة برمجة، على الرغم من أن المهمة تكون أسهل في اللغات التي توفر '''تجريدات عالية المستوى'''.

على الرغم من أنها لا تتناسب تمامًا مع نموذج توجيه الأحداث، فإن معالجة المقاطعات ومعالجة الاستثناءات لهما العديد من أوجه التشابه. مممممممممممم على الرغم من أنها لا تتناسب تمامًا مع نموذج **توجيه الأحداث (event-driven model)**، إلا أن '''معالجة المقاطعات''' **(interrupt handling)** و'''معالجة الاستثناءات''' **(exception handling)** تشتركان في العديد من أوجه التشابه.

من المهم التمييز بين النماذج التي تعتمد على **الأحداث** وتلك التي تعتمد على **الرسائل** (أو التي تُعرف أيضًا بالنماذج التي تعتمد على قائمة الانتظار). الخدمات القائمة على الأحداث (مثل AWS SNS) تكون منفصلة عن مستهلكيها. في المقابل، الخدمات التي تعتمد على قوائم الانتظار/الرسائل (مثل AWS SQS) تكون مقترنة بمستهلكيها.. 

## حلقة الحدث
نظرًا لأن  التي تستقبل وترسل الأحداث شائعة في مختلف التطبيقات، فإن العديد من **أطر البرمجة** تتولى مهمة تنفيذها. وبذلك، يُتوقع من المستخدم توفير الكود الخاص بـ**معالجات الأحداث** فقط.

كانت لغة البرمجة '''RPG'''، وهي لغة مبكرة من شركة IBM، تتميز بمفهوم تصميم في ستينيات القرن الماضي يشبه البرمجة القائمة على الأحداث التي ناقشناها أعلاه. فقد قدمت حلقة إدخال/إخراج رئيسية مدمجة (تُعرف باسم "دورة البرنامج") حيث كانت العمليات الحسابية تستجيب وفقًا "للمؤشرات" () التي يتم تعيينها في وقت سابق من الدورة.

### معالجات الأحداث
يتضمن المنطق الفعلي داخل **روتينات معالجة الأحداث (event-handling routines)**. تتعامل هذه الروتينات مع الأحداث التي سيستجيب لها البرنامج الرئيسي. على سبيل المثال، قد يؤدي النقر بزر الفأرة الأيسر مرة واحدة على زر أمر في برنامج واجهة المستخدم الرسومية إلى تشغيل روتين يفتح نافذة أخرى، أو يحفظ البيانات في قاعدة بيانات، أو ينهي التطبيق. توفر العديد منبيئات التطوير المتكاملة**(IDEs)** للمبرمج قوالب لأحداث واجهة المستخدم الرسومية، مما يسمح للمبرمج بالتركيز على كتابة كود معالجة الحدث.

في البرامج المتسلسلة، يكون تتبع سير الأحداث سهلاً عادةً. أما في البرامج الموجهة بالأحداث، ولأن **معالجات الأحداث** تُنفذ استجابةً لأحداث خارجية، فإن هيكلة هذه المعالجات بشكل صحيح لتعمل بأي ترتيب استدعاء قد يتطلب اهتمامًا خاصًا وتخطيطًا دقيقًا.

بالإضافة إلى كتابة **معالجات الأحداث (event handlers)**، يجب أيضًا **ربط** هذه المعالجات بالأحداث؛ وذلك لضمان استدعاء الدالة الصحيحة عند وقوع الحدث. بالنسبة لأحداث واجهة المستخدم، تجمع العديد من **بيئات التطوير المتكاملة (IDEs)** بين هاتين الخطوتين: فبمجرد النقر المزدوج على زر، يقوم المحرر بإنشاء معالج حدث (فارغ) مرتبط بنقرة المستخدم على الزر، ثم يفتح نافذة نصية لتتمكن من تعديل معالج الحدث.

## الاستخدامات الشائعة
تعتمد غالبية هياكل **واجهات المستخدم الرسومية (GUI)** الحديثة على البرمجة الموجهة بالأحداث. فمثلاً، يحتوي نظام Windows على  **(event loop)** خاصة به. وبالمثل، يقوم إطار عمل Java AWT بمعالجة جميع تغييرات واجهة المستخدم على خيط واحد، يُعرف بـ **(Event Dispatch Thread)**. وبطريقة مشابهة، تحدث جميع تحديثات واجهة المستخدم في إطار عمل JavaFXعلى **خيط تطبيق JavaFX (JavaFX Application Thread)**. 

تعتمد معظم **خوادم الشبكة (network servers)** و**أطر العمل (frameworks)**، مثل **Node.js**، أيضًا على الأحداث..

## معالجة المقاطعات والاستثناءات

## انظر أيضا

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

## مراجع

## روابط خارجية

* تم تقديم أنماط التزامن في scaleconf
* البرمجة القائمة على الأحداث: المقدمة، البرنامج التعليمي، التاريخ ، البرنامج التعليمي من تأليف ستيفن فيرج
* البرمجة الموجهة بالأحداث ، برنامج تعليمي من إعداد آلان جولد
* التعاون في الأحداث ، مقال بقلم مارتن فاولر
* إعادة التفكير في خيوط التأرجح ، مقال بقلم جوناثان سيمون
* أسلوب البرمجة الموجه بالأحداث  ، مقال بقلم كريس ماكدونالد
* البرمجة الموجهة بالأحداث باستخدام تخصص القالب ، مقال بقلم كريستوفر ديجينز
*
* البرمجة القائمة على الأحداث والوكلاء ، الفصل
* موارد LabWindows/CVI
* نظام نشر/اشتراك الأحداث الموزع ، وهو مثال مفتوح المصدر قيد الإنتاج على MSN.com وMicrosoft.com

تصنيف:مقالات تحوي أمثلة مكتوبة بشبه رماز
تصنيف:أنماط برمجة