2013-06-28 3 views
0

В настоящее время я работаю с программой, которая использует обратные вызовы в потоке для управления переменной класса для статического класса. Когда любой метод, управляющий объектом, называется нитью. Если кто-нибудь может взглянуть и рассказать мне, что я делаю неправильно, или как я мог бы сделать то же самое лучше, это было бы очень оценено. Ниже приведена простая программа, которая реплицирует проблему.Ruby thread dying при манипулировании данными

В phone.rb:

class Phone 
    @@ringer = "RingVibrateRingVibrateRing" 
    def self.get_ringer 
    return @@ringer 
    end 

    def set_ringer(new_ring) 
    @@ringer = new_ring 
    end 

    def self.calling_you(reached) 
    puts "Calling you. " 
    t = Thread.new { 
     sleep(3) 
     reached.call 
     Thread.exit 
    } 
    sleep(10) 
    puts "Thanks for calling me back!" 
    end 
end 

В CallTree.rb

require 'thread' 
require 'C:\Users\mabauer\Desktop\phone.rb' 


def calling_you_back 
    ring_sound = Phone.get_ringer 
    puts "#{ring_sound}" 
    # The following line is where issues occur, when commented it works fine 
    Phone.set_ringer("RingingRingingRinging") 
    ring_sound = Phone.get_ringer 
    puts "#{ring_sound}" 
    puts "I called you back." 
end 

begin 
    Phone.calling_you(method(:calling_you_back)) 
end 

ответ

0

Вы должны установить обработчик исключений в вашем потоке, так что вы можете увидеть, если что-то пойдет не так:

begin 
    sleep(3) 
    reached.call 
    Thread.exit 
rescue => err 
    warn err 
end 

В качестве альтернативы, вы можете сделать свой сценарий прервать с трассировкой, когда любой поток вызывает исключение:

Thread.abort_on_exception = true 

Ошибка, которую я вижу, заключается в том, что set_ringer не является методом класса. Убедитесь, что вы определили его как self.set_ringer.

0

Вы звоните Phone.set_ringer(...), но set_ringer определяется как метод экземпляра. Сделайте это методом класса (def self.set_ringer(...)), и он будет работать.

Смежные вопросы