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

ScheduledTaskObjectTrueまたは)の最後のエントリは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]}

それらは異なることに注意してください。変数はfalseFalseを示している間に表示されます。ScheduledTasks[]これは、変数が実際にはタスクオブジェクトを保持していないことを示しています。変数myTaskを直接変更することによって、タスクを変更することはできません。タスクの実際の状態はによって返されScheduledTasks[]ます。

ScheduledTaskObject式の最初のエントリは、タスクに対応する一意の番号であると想定するのが妥当です。1したがって、タスクで実行される手動操作では、おそらくこの番号を「ハンドル」として使用でき、次のような識別子を使用してタスクの状態を確認できます。

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

ScheduledTaskObjectこのアプローチ(からの識別子を使用)が正しいかどうかはまったくわかりません。新しいカーネルにすでにいくつかのタスクがあり(おそらくフロントエンドが原因です---いくつかのノートブックを開いていて、いくつかは動的要素を使用していて、タスクを実験してきました)、時々ScheduledTasks[]いくつかのタスクを返す状況に気づきました同じ識別子で(通常は0)。

要約すれば:

  1. 識別子(の最初の番号ScheduledTaskObject)でタスクを処理する信頼できる方法ですか?

  2. CreateScheduledTask最初にタスクを作成したときに取得した式を前提として、スケジュールされたタスクの状態を照会する正しい方法は何ですか?

編集:可能であれば、CPUをあまり使用せずに、スケジュールされたタスクの状態を表示する動的セルがあると便利です。誰かがこれを行う方法について何かアイデアがありますか?

4

1 に答える 1

5

のドキュメントは確かに最初の議論ScheduledTaskObjectに使用されており、それは確かにユニークだと思います。私はあなたが主張するのと同じID(または0のID)で複数を再現することができなかったので、最小限の例を提供できればそれは素晴らしいことです。idScheduledTaskObjects

いずれの場合も(複数のタスクが同じ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 に答える