#timer #julia
#таймер #julia
Вопрос:
У Julia есть объект Timer, который может запускать функцию обратного вызова с заданной частотой повторения. Согласно стандартной библиотеке, единственными функциями, использующими таймер, являются start_timer() и stop_timer().
Есть ли способ с учетом таймера проверить, запущен он в данный момент или нет?
Ответ №1:
Лучший способ найти что-то подобное — methodswith
. К сожалению, для объектов Julia Timer
определено не так много методов:
julia> methodswith(Timer, true) # true to check super types, too (but not Any)
5-element Array{Method,1}:
stop_timer(timer::Timer) at stream.jl:499
close(t::Timer) at stream.jl:460
start_timer(timer::Timer,timeout::Int64,repeat::Int64) at deprecated.jl:204
start_timer(timer::Timer,timeout::Real,repeat::Real) at stream.jl:490
close(t::Timer) at stream.jl:460
Итак, мы должны копнуть немного глубже. Просмотр реализации для Timer показывает, что он просто оборачивает объект libuv timer. Итак, я только что выполнил поиск через libuv / include / uv.h для API таймера и нашел int uv_is_active(const uv_handle_t* handle)
, который выглядит очень многообещающим. Я просто оборачиваю этот вызов c в функцию Julian, и это работает как шарм:
julia> isactive(t::Timer) = bool(ccall(:uv_is_active, Cint, (Ptr{Void},), t.handle));
julia> t = Timer((x)->println(STDOUT,"nboo"));
julia> isactive(t)
false
julia> start_timer(t, 10., 0); # fire in 10 seconds, don't repeat
julia> isactive(t)
true
julia>
boo
julia> isactive(t)
false