Есть ли способ запросить таймер Julia, чтобы узнать, запущен он или нет?

#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