هل إشارات glib غير متزامنة؟
-
23-09-2019 - |
سؤال
عند استخدام GLIB لإرسال الإشارات من خلال emit
, ، هل كل ما يسمى "المستمعين"/المعالجون أو هل يتم التخلي عن التحكم إلى حلقة الحدث بعد كل مستمع/معالج؟
المحلول
تسمى جميع عمليات الاسترجاعات إلى الوراء دون التخلي عن التحكم في الحلقة الرئيسية.
في الواقع ، على حد علمي ، لا يعود G_Signal_emit () إلى التحكم حتى يتم استدعاء جميع المعالجات ، لذلك لا توجد فرصة لركلة الحلقة الرئيسية.
للإجابة على السؤال في عنوان هذا المنشور: لا ، فإن إشارات Glib ليست غير متزامنة.
نصائح أخرى
يمكن التعامل مع إشارات GLIB بشكل متزامن أو غير متزامن. تكون إشارات GoBject متزامنة دائمًا ، أي عندما تنبعث منها إشارة لا تعود حتى يتم التعامل مع الإشارة. للحصول على إشارة غير متزامنة مع GLIB ، (أنا أستخدم VALA لإيجاز - استخدم برنامج التحويل البرمجي VALA لتحويل الكود إلى عادي C) يجب عليك تحديد مصدر إشارة ، أو استخدام مخطط محدد مسبقًا ، كما هو الحال في IDLESOURCE أو مهلة (متى I/O غير وارد). على سبيل المثال ، افترض أن لديك وظيفة
void my_func() {
stdout.puts("Hello world! (async)\n");
}
وتريد أن تسميها بشكل غير متزامن (من نفس الخيط!) من
void caller() {
// Here you want to insert the asynchronous call
// that will be invoked AFTER caller has returned.
// Body of caller follows:
stdout.puts("Hello world!\n");
}
هنا كيف تفعلها:
void caller() {
// Code for the asynchronous call:
var ev = new IdleSource();
ev.set_callback(() => {
my_func();
return Source.REMOVE; // Source.REMOVE = false
});
ev.attach(MainContext.default());
// Body of caller follows:
stdout.puts("Hello world!\n");
}
سوف تحصل على الإخراج التالي:
Hello world!
Hello world! (async)
سيتم تنفيذ وظيفة my_func () عندما يكون mainloop خاملاً (أي أنه لا يوجد لديه إشارات أخرى للمعالجة). لتشغيله بعد انقضاء فترة زمنية محددة ، استخدم مصدر إشارة المهلة. يجب أن يكون mainloop يعمل ، وإلا فإن هذا لن يعمل.
توثيق: