使用ruby设计一个计时器,并可以重置的问题

zhangkai5302 2017-05-17 04:24:39

各位大牛,我现在有这样一个问题!
使用ruby,设计一个30秒的计时器,如果时间到达30秒,可去执行一个自定义函数。但是计时器在0到30秒计时的过程中,可能每过5秒就会接收到一个消息,如果计时器接收到这个消息,便把现在记录的时间重置为0,重新开始计时。
总结一下,有点像看门狗,设置了一个超时时间,并会不断去喂狗,如果超过设置的超时时间一直没有喂狗,便执行一个操作,如果喂狗了,便把计时重置。
请问ruby有没有实现这种的gem包,或者有相应资料。谢谢!
...全文
6039 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevk 2019-05-22
  • 打赏
  • 举报
回复
@c=30
@i=0

Thread.new do #收到回车就重新计数
  loop do
    if gets
      puts " reset "
      print @c
      @i=0
    end
  end                                                                           
end

puts "按回车重新计数"
loop do #每秒减1
  print @c-@i
  sleep 1
  @i+=1 
  print "\r"
  exit if @i >= @c
end
  • 打赏
  • 举报
回复
zyycode 2019-04-07
  • 打赏
  • 举报
回复

require 'date'

class Dog
  DURATION = 3
  @@id = 0

  attr_accessor :fed, :id, :thread, :expired

  def initialize
    @id = @@id += 1

    puts "[#{DateTime.now.iso8601}] Dog##{id} created"

    @thread = Thread.new {
      sleep DURATION

      if fed
        puts "[#{DateTime.now.iso8601}] Dog##{id} survives"
      else
        puts "[#{DateTime.now.iso8601}] Dog##{id} died"
      end

      self.expired = true
    }
  end
end

dogs = []
puts ">>> Press [Enter] to feed a dog"
dogs << Dog.new

while input = gets.chomp do
  Process.exit(true) if dogs.all?(&:expired)

  dogs.last.fed = true
  puts "[#{DateTime.now.iso8601}] Dog##{dogs.last.id} fed"
  dogs << Dog.new # Reset timer
end
基本上你需要使用Thread来建立timer,目的是不阻止你收消息的机制 (Non-Blocking) 以上代码只使用了标准库 你也可以使用现成的Gem来简化代码: 如: https://github.com/ruby-concurrency/concurrent-ruby 类似这样的 Non-Blocking 操作 在不同语言中常出现的关键词为 async/await (NodeJS, Python 和 Go 都有async)
Msxindl_Com 2017-05-17
  • 打赏
  • 举报
回复
没用过日本人的RUBY,整不懂
zhangkai5302 2017-05-17
  • 打赏
  • 举报
回复
准确的说是计时器在0到30秒计时的过程中,任意时间,都可能会接收到一个消息,如果计时器接收到这个消息,便把现在记录的时间重置为0,重新开始计时。

2,763

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ruby/Rails
社区管理员
  • Ruby/Rails社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧