Как можно запросить состояние (активное или нет) запланированной задачи?

Каков предпочтительный способ проверить, активна ли запланированная задача?

Я опишу свое решение ниже, но я не уверен, что это действительно лучший способ сделать это.


Запланированная задача создается следующим образом:

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 ).

Вкратце:

  1. Является ли это надежным способом обработки задач по их идентификатору (первое число из их ScheduledTaskObject )?

  2. Как правильно запрашивать состояние запланированного задача, учитывая выражение, которое мы получаем из CreateScheduledTask при ее первом создании?

РЕДАКТИРОВАТЬ: Если это возможно, было бы неплохо иметь динамическую ячейку, показывающую состояние запланированной задачи , не используя слишком много процессора. Есть ли у кого-нибудь идеи о том, как это сделать?

5
задан Mr.Wizard 29 October 2011 в 14:01
поделиться