Я искал пример онлайн, демонстрирующий таймер в рубине, и столкнулся с кодом ниже. Это работает как ожидалось, но это имеет смысл, что эта простая программа использует 30 мес памяти (как показано в диспетчере задач окон) и слишком много ЦП?
Большое спасибо
def time_block
start_time = Time.now
Thread.new { yield }
Time.now - start_time
end
def repeat_every(seconds)
while true do
time_spent = time_block { yield } # To handle -ve sleep interaval
sleep(seconds - time_spent) if time_spent < seconds
end
end
repeat_every(5) {
}
Вам необходимо использовать свой первый синтаксис, и если вы используете класс вне решения Visual Studio, необходимо проверить файл XML-документации в свойствах проекта.
-121--3977885-Я бы нашел пару демонстрационных приложений Silverlight и просмотрел источник. Тогда я бы определить очень простой проект, и, как было предложено другими, и код полного маленького приложения. Затем я выбросил приложение и сделал это снова с опытом и знаниями, которые вы получили от первой итерации.
-121--3266089-Как отмечено в комментариях к вопросу, все, что нужно для того, чтобы это сработало, это то, что вы присоединяетесь к потоку:
#!/usr/bin/ruby1.8
def repeat_every(interval, &block)
loop do
start_time = Time.now
Thread.new(&block).join
elapsed = Time.now - start_time
sleep([interval - elapsed, 0].max)
end
end
repeat_every(5) do
puts Time.now.to_i
end
# => 1266437822
# => 1266437827
# => 1266437832
...
Однако на месте нет причин использовать потоки для кода в вопросе:
def repeat_every(interval)
loop do
start_time = Time.now
yield
elapsed = Time.now - start_time
sleep([interval - elapsed, 0].max)
end
end
repeat_every(5) do
puts Time.now.to_i
end
# => 1266437911
# => 1266437916
# => 1266437921
Теперь, если вы хотите поток, который делает что-то через промежутки времени, так что основная программа может сделать что-то другое, то вы завернете весь этот цикл в поток.
def repeat_every(interval)
Thread.new do
loop do
start_time = Time.now
yield
elapsed = Time.now - start_time
sleep([interval - elapsed, 0].max)
end
end
end
thread = repeat_every(5) do
puts Time.now.to_i
end
puts "Doing other stuff..."
thread.join
# => 1266438037
# => Doing other stuff...
# => 1266438042
# => 1266438047