2013-06-28 125 views
0

我目前正在使用一個程序,該線程利用線程中的回調來操作靜態類的類變量。當任何操縱對象的方法被稱爲線程死亡。如果任何人都可以看看並告訴我我做錯了什麼,或者我怎麼能夠以更好的方式完成同樣的事情,那將非常感激。下面是一個複製問題的簡單程序。操作數據時Ruby線程死亡

在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(...)),它將起作用。