Какой предпочтительный способ проверить, является ли запланированное задание активным или нет?
Ниже я опишу свое решение, но я не уверен, что это действительно лучший способ сделать это.
Запланированное задание создается следующим образом:
In[1]:= myTask=CreateScheduledTask[Print["task 1"], 30]
Out[1]= ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]
Мы можем проверить существующие задачи следующим образом:
In[2]:= ScheduledTasks[]
Out[2]= {ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]}
Последняя запись в ScheduledTaskObject
(True
или False
) отображается, чтобы указать, запущена задача или нет.
Теперь давайте запустим задачу и сравним содержимое переменной myTask
со списком, возвращаемым ScheduledTasks[]
.
In[3]:= StartScheduledTask[myTask]
Out[3]= ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]
In[4]:= {ScheduledTasks[],myTask}
Out[4]= {{ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,True]},
ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]}
Обратите внимание, что они отличаются. Переменная показывает False
, а ScheduledTasks[]
показывает false. Это показывает, что переменная фактически не содержит объект задачи. Изменяя переменную myTask
напрямую, мы не можем изменить задачу. Реальное состояние задачи возвращается ScheduledTasks[]
.
Кажется разумным предположить, что первая запись в выражении ScheduledTaskObject
является уникальным числом, соответствующим задаче. Таким образом, любая ручная операция, выполняемая над задачей, может использовать этот номер как «дескриптор», и мы можем проверить состояние задачи с идентификатором 1
, например:
Cases[ScheduledTasks[], ScheduledTaskObject[1,__,state_] :> state]
Я совсем не уверен, что этот подход (с использованием идентификатора из ScheduledTaskObject
) является правильным. Я заметил ситуации, когда в новом ядре уже были некоторые задачи (возможно, из-за внешнего интерфейса - у меня было несколько открытых ноутбуков, некоторые с динамическими элементами, и я экспериментировал с задачами), а иногда ScheduledTasks[]
возвращает несколько задач с одинаковым идентификатором (обычно 0
).
В итоге:
Это надежный способ обработки задач по их идентификатору (первое число из их ScheduledTaskObject
)?
Как правильно запрашивать состояние запланированной задачи, учитывая выражение, которое мы получаем из CreateScheduledTask
при первом создании?
РЕДАКТИРОВАТЬ: Если это возможно, было бы также неплохо иметь динамическую ячейку, отображающую состояние запланированной задачи, без использования слишком большого количества ЦП. У кого-нибудь есть идеи как это сделать?