2011-10-29 1 views
5

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

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


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

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, когда мы его впервые создали?

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

ответ

5

В документации для ScheduledTaskObject действительно используется id для первого аргумента, а I думаю, что действительно уникален. Я не смог воспроизвести несколько ScheduledTaskObjects с тем же идентификатором, что и вы (ни с 0), поэтому, если бы вы могли предоставить минимальный пример, было бы неплохо.

В любом случае (при условии, что несколько задач имеют один и тот же идентификатор), вы можете сузить свое соответствие, также проверяя точное определение задачи. Вот ваша простая модификация.

[email protected] 
pollState[task_ScheduledTaskObject] := 
Module[{id = Level[task, 1][[1]], expr = Level[task, 1][[2]]}, 
    out = Cases[ScheduledTasks[], 
    ScheduledTaskObject[[email protected], [email protected], __, state_] :> 
    state]; 
    Return[If[out === {}, "Task not found", [email protected]]]] 

Вы можете создать Dynamic вывод о состоянии вашей задачи и установить интервал обновления на то, как 1 секунду (или больше), так что это не постоянно опрашивать для государства, следовательно, замедляет вас ,

Dynamic[Refresh[pollState[myTask], UpdateInterval -> 1]] 
+0

Я попытаюсь придумать минимальный пример, хотя это непросто, потому что я считаю, что это связано с каким-то интерфейсом. Иногда оценка 'ScheduledTasks []' сразу после 'Quit' давала две задачи, как с id' 0'. – Szabolcs

+0

@Szabolcs Я не удивлюсь, если id 0 был назначен специально для задач, связанных с ядрами. Задачи, заданные пользователем, начинаются с 1. Возможно, просто включить проверку для исключения 0 (что не понадобится, поскольку 'myTask' будет иметь' id> 0') – abcd

+0

Запустите Mathematica и оцените что-то. Затем оцените «Quit». Затем оцените 'ScheduledTasks []'. Я получаю список из трех элементов, все с ID 0: http://pastie.org/2778819 – Szabolcs

 Смежные вопросы

  • Нет связанных вопросов^_^