سؤال

عند استخدام 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 يعمل ، وإلا فإن هذا لن يعمل.

توثيق:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top