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]}

请注意,它们是不同的。变量显示FalseScheduledTasks[]显示为假。这表明该变量实际上并不保存任务对象。通过直接修改变量myTask我们不能修改任务。任务的真实状态由ScheduledTasks[].

假设ScheduledTaskObject表达式中的第一个条目是与任务对应的唯一编号,这看起来是合理的。因此,对任务执行的任何手动操作都可能将此数字用作“句柄”,我们可以使用1如下标识符检查任务的状态:

Cases[ScheduledTasks[], ScheduledTaskObject[1,__,state_] :> state]

我完全不确定这种方法(使用 中的标识符ScheduledTaskObject)是否正确。我注意到新内核中已经有一些任务的情况(可能是由于前端——我打开了几个笔记本,一些带有动态元素,我一直在试验任务),有时会ScheduledTasks[]返回几个任务具有相同的标识符(通常0)。

总之:

  1. 通过标识符(他们的第一个数字ScheduledTaskObject)处理任务是一种可靠的方法吗?

  2. CreateScheduledTask给定我们第一次创建它时得到的表达式,查询计划任务状态的正确方法是什么?

编辑:如果可能的话,最好有一个动态单元格显示计划任务的状态,而不使用太多 CPU。有人对如何做到这一点有任何想法吗?

4

1 回答 1

5

文档ScheduledTaskObject确实id用于第一个论点,我认为它确实是独一无二的。我无法重现ScheduledTaskObjects具有与您声称的相同 id 的多个(也不是具有 0 的),因此如果您能提供一个最小的示例,那就太好了。

在任何情况下(假设多个任务具有相同的 id),您还可以通过检查任务的确切定义来缩小匹配范围。这是你的一个简单的修改。

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

您可以创建Dynamic任务状态的输出并将更新间隔设置为 1 秒(或更多),这样它就不会不断轮询状态,从而减慢您的速度。

Dynamic[Refresh[pollState[myTask], UpdateInterval -> 1]]
于 2011-10-29T14:39:44.650 回答