مجدول المهام بلغة C++: نظرة عامة وأمثلة على الاستخدام
في التطوير الحديث بلغة C++، غالبًا ما تنشأ الحاجة لتنفيذ إجراءات معينة وفقًا لجدول زمني، أو بتأخير، أو بشكل دوري. ولهذا الغرض، تُستخدم مجدولات المهام (task schedulers). في هذه المقالة، سنستعرض ثلاثة مناهج ومكتبات شائعة لتنفيذ مجدول مهام بلغة C++: TaskFlow، CronCpp، و Boost.Asio. ستتعرف على كيفية اختيار الأداة المناسبة لمشروعك، وسترى أمثلة على الكود.
لماذا نحتاج إلى مجدول المهام؟
يسمح مجدول المهام بما يلي:
- تنفيذ عمليات في الخلفية في وقت محدد (مثل تنظيف ذاكرة التخزين المؤقت في الساعة 3:00 صباحًا).
- تشغيل المهام الدورية بفاصل زمني محدد (مثل استقصاء جهاز استشعار كل 5 ثوانٍ).
- تأخير تنفيذ مهمة لفترة زمنية معينة.
- إدارة التنفيذ المتوازي للمهام مع مراعاة التبعيات.
1. TaskFlow — مجدول حديث مع رسم بياني للمهام
TaskFlow هي مكتبة لبناء الرسوم البيانية للمهام مع دعم الجدولة والتنفيذ المتوازي. إنها مفيدة بشكل خاص عندما تكون المهام معتمدة على بعضها البعض وتحتاج إلى التنفيذ بترتيب معين.
الإمكانيات الرئيسية لـ TaskFlow:
- بناء رسوم بيانية موجهة غير دورية (DAG) للمهام.
- دعم التبعيات الشرطية والدورية.
- توزيع المهام تلقائيًا على الخيوط.
- دعم مدمج للمؤقتات والتأخيرات.
مثال: مهمة بسيطة مع تأخير
#include <taskflow/taskflow.hpp>#include <iostream>#include <chrono>
int main() { tf::Executor executor; tf::Taskflow taskflow;
// إنشاء مهمة مع تأخير لمدة ثانيتين auto [A, timer] = taskflow.emplace([](){ std::cout << "تم تنفيذ المهمة A بعد ثانيتين" << std::endl; });
// إعداد المؤقت timer.name("timer"); timer.silent_delay(std::chrono::seconds(2));
// تشغيل المجدول executor.run(taskflow).wait(); return 0;}يقوم هذا الكود بإنشاء مهمة سيتم تنفيذها بعد ثانيتين من تشغيل المجدول. يدير TaskFlow الخيوط والوقت تلقائيًا.
2. CronCpp — مجدول خفيف مع بناء جملة cron
CronCpp هي مكتبة بسيطة للغاية لجدولة المهام وفقًا لجدول cron. إنها مثالية إذا كنت بحاجة إلى تحديد وقت التنفيذ بتنسيق مألوف (مثل cron في Linux).
الإمكانيات الرئيسية لـ CronCpp:
- دعم بناء جملة cron القياسي (الدقائق، الساعات، الأيام، الأشهر، أيام الأسبوع).
- خفيفة الوزن — لا تتطلب Boost أو تبعيات ثقيلة أخرى.
- API بسيط لإضافة وإزالة المهام.
مثال: مهمة كل دقيقة
#include <croncpp/croncpp.h>#include <iostream>#include <thread>#include <chrono>
int main() { cron::Cron cron; // إضافة مهمة يتم تنفيذها كل دقيقة cron.schedule("* * * * *", [](){ std::cout << "يتم تنفيذ المهمة كل دقيقة!" << std::endl; });
// تشغيل المجدول في خيط خلفية std::thread cron_thread([&cron](){ cron.start(); });
// السماح بالعمل لمدة 5 دقائق std::this_thread::sleep_for(std::chrono::minutes(5)); cron.stop(); cron_thread.join(); return 0;}في هذا المثال، سيتم تنفيذ المهمة كل دقيقة. يقوم CronCpp تلقائيًا بحساب وقت التشغيل التالي واستدعاء الدالة.
3. Boost.Asio — مجدول قوي للمهام غير المتزامنة
Boost.Asio ليس مجرد مجدول، بل هو مكتبة كاملة للبرمجة غير المتزامنة. تُستخدم مؤقتاتها ومجدولات المهام على نطاق واسع