# asynchronous_object.rb # # Copyright © 2009 Preston Lee. All rights reserved. require 'thread' class AsychronousObject attr_reader :thread attr_reader :update_frequency attr_reader :last_updated def initialize(freq) @update_freqency = freq # puts @update_freqency @mutex = Mutex.new start end def start @last_updated = Time.now @state = :active # or :inactive # puts @mutex @thread = Thread.new do keep_going = true while keep_going do @mutex.synchronize do # puts "going" keep_going = false if @state == :inactive end if keep_going now = Time.now # puts "TL '#{@last_updated}' N #{now} F #{@update_freqency}" update(@last_updated, now) @last_updated = now sleep @update_freqency end end end end def update puts "FAIL!" raise "You need to implement this method!" end def activate @mutex.synchronize do case @state when :active # do nothing when :inactive start end end end def deactivate @mutex.synchronize do @state = :inactive end end def join @thread.join end end