الفرق بين المراجعتين ل"Ruby/Thread/pending interrupt-3F"

من موسوعة حسوب
< Ruby‏ | Thread
اذهب إلى التنقل اذهب إلى البحث
سطر 56: سطر 56:
 
==انظر أيضا==
 
==انظر أيضا==
 
* التابع <code>[[Ruby/Thread/priority|priority]]</code>: يُعيد التابع <code>priority</code> أولوية [[Ruby/Thread|المهمة الفرعية]]
 
* التابع <code>[[Ruby/Thread/priority|priority]]</code>: يُعيد التابع <code>priority</code> أولوية [[Ruby/Thread|المهمة الفرعية]]
 +
*  تابع النسخة<code>[[Ruby/Thread/pending interrupt-3F-i|pending_interrupt?]]‎:</code>يتحقق التابع <code>pending_interrupt?‎</code> مما إذا كان طابور الانتظار غير المتزامن (asynchronous queue) فارغًا أم لا [[Ruby/Thread|للمهمة الفرعية]] التي استُدعي معها.
 
==مصادر==
 
==مصادر==
 
*[http://ruby-doc.org/core-2.5.1/Thread.html#method-i-pending_interrupt-3F قسم  التابع pending_interrupt?‎ في الصنف Thread‎ في توثيق روبي الرسمي.]
 
*[http://ruby-doc.org/core-2.5.1/Thread.html#method-i-pending_interrupt-3F قسم  التابع pending_interrupt?‎ في الصنف Thread‎ في توثيق روبي الرسمي.]

مراجعة 11:37، 6 نوفمبر 2018

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

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

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

إذا تم إعطاء الوسيط error (انظر فقرة البنية العامة)، فتحقق فقط من الأحداث المؤجلة من نوع 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

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

يعيد لتابع pending_interrupt?‎ قيمة منطقية.

أمثلة

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

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

انظر أيضا

مصادر