التابع Thread.pending_interrupt?‎‎ في روبي

من موسوعة حسوب
< Ruby‏ | Thread
مراجعة 12:47، 5 ديسمبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات) (مراجعة وتدقيق.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

يتحقق التابع pending_interrupt?‎ مما إذا كان طابور الانتظار غير المتزامن (asynchronous queue) فارغًا أم لا.

بما أنه يمكن استخدام handle_interrupt لتأجيل الأحداث غير المتزامنة، فمن الممكن استخدام هذا التابع للتحقق مما إذا كانت هناك أي أحداث مؤجلة.

إن أعاد هذا التابع القيمة true، فيمكنك إنهاء كتل ‎:never.

إذا مُرِّر نوع الخطأ إلى التابع، فسيتحقق فقط من الأحداث المؤجلة من النوع error.

الاستخدام

اطلع على المثال التالي:

th = Thread.new{
  Thread.handle_interrupt(RuntimeError => :on_blocking){
    while true
      ...
      # reach safe point to invoke interrupt
      if Thread.pending_interrupt?
        Thread.handle_interrupt(Object => :immediate){}
      end
      ...
    end
  }
}
...
th.raise # stop thread‎

يمكن كتابة هذا المثال أيضًا بالطريقة التالية، والتي عليك استخدامها إن أردت تجنب المقاطعات (interrupts) غير المتزامنة.

flag = true
th = Thread.new{
  Thread.handle_interrupt(RuntimeError => :on_blocking){
    while true
      ...
      # reach safe point to invoke interrupt
      break if flag == false
      ...
    end
  }
}
...
flag = false # stop thread‎

البنية العامة

pending_interrupt?(error = nil)  true/false

القيمة المعادة

تعاد القيمة true إذا كان طابور الانتظار غير المتزامن (asynchronous queue) فارغًا. خلا ذلك، تعاد القيمة false.

أمثلة

في المثال أدناه، يعالج التابع التالي تأجيل الأحداث غير المتزامنة على الفور:

def Thread.kick_interrupt_immediately
  Thread.handle_interrupt(Object => :immediate) {
    Thread.pass
  }
end

انظر أيضًا

مصادر