2011-10-29 30 views
5

Cách ưa thích để kiểm tra xem tác vụ được lên lịch có đang hoạt động hay không?Trạng thái (hoạt động hay không) của tác vụ được lên lịch có thể được truy vấn như thế nào?

Tôi sẽ phác thảo giải pháp của mình bên dưới, nhưng tôi không chắc đây thực sự là cách tốt nhất để làm điều đó.


Một nhiệm vụ theo lịch trình được tạo ra như thế này:

In[1]:= myTask=CreateScheduledTask[Print["task 1"], 30] 

Out[1]= ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False] 

Chúng ta có thể kiểm tra các công việc hiện tại như thế này:

In[2]:= ScheduledTasks[] 
Out[2]= {ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]} 

Mục cuối cùng trong ScheduledTaskObject (True hoặc False) xuất hiện để cho biết liệu tác vụ có bắt đầu hay không.

Bây giờ, hãy bắt đầu nhiệm vụ và so sánh nội dung của biến số myTask với danh sách được trả về bởi 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]} 

Lưu ý rằng chúng khác nhau. Biến hiển thị False trong khi ScheduledTasks[] hiển thị sai. Điều này chứng tỏ rằng biến không thực sự giữ đối tượng nhiệm vụ. Bằng cách sửa đổi biến số myTask trực tiếp, chúng tôi không thể sửa đổi nhiệm vụ. Trạng thái thực sự của tác vụ được trả về bởi ScheduledTasks[].

Có vẻ hợp lý để giả định rằng mục nhập đầu tiên trong biểu thức ScheduledTaskObject là một số duy nhất tương ứng với tác vụ. Vì vậy, bất kỳ thao tác bằng tay thực hiện vào các nhiệm vụ có lẽ có thể sử dụng con số này như là một "tay cầm", và chúng ta có thể kiểm tra trạng thái của công việc với định danh 1 như thế này:

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

Tôi không chắc chắn ở tất cả mặc dù cách tiếp cận này (sử dụng số nhận dạng từ ScheduledTaskObject) là chính xác. Tôi đã nhận thấy tình huống khi đã có một số nhiệm vụ trong hạt nhân tươi (có lẽ do giao diện người dùng --- tôi có một vài sổ tay mở, một số có yếu tố động và tôi đã thử nghiệm các tác vụ) và đôi khi ScheduledTasks[] trả về một số nhiệm vụ có cùng số nhận dạng (thường là 0).

Nói tóm lại:

  1. Có một cách đáng tin cậy để xử lý các nhiệm vụ do nhận dạng của họ (số đầu tiên từ ScheduledTaskObject của họ)?

  2. Cách chính xác để truy vấn trạng thái của tác vụ được lên lịch, cho biểu thức chúng tôi nhận được từ CreateScheduledTask khi chúng ta tạo nó lần đầu tiên là gì?

EDIT: Nếu có thể, nó cũng sẽ được tốt đẹp để có một tế bào động hiển thị trạng thái của một tác vụ theo lịch trình, mà không sử dụng quá nhiều CPU. Có ai có bất kỳ ý tưởng về làm thế nào để làm điều này?

Trả lời

5

Tài liệu cho ScheduledTaskObject thực sự sử dụng id cho đối số đầu tiên và tôi nghĩ rằng thực sự là duy nhất. Tôi đã không thể tái tạo nhiều số ScheduledTaskObjects với cùng một id như bạn xác nhận quyền sở hữu (cũng không phải là những người có 0), vì vậy nếu bạn có thể cung cấp một ví dụ tối thiểu, nó sẽ là tốt đẹp.

Trong mọi trường hợp (giả sử nhiều hơn một tác vụ có cùng id), bạn có thể thu hẹp đối sánh của mình bằng cách kiểm tra định nghĩa chính xác của tác vụ. Đây là một sửa đổi đơn giản của bạn.

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

Bạn có thể tạo ra Dynamic của tình trạng công việc của bạn và thiết lập khoảng thời gian cập nhật cho một cái gì đó giống như 1 giây (hoặc nhiều hơn), do đó nó không ngừng thăm dò ý kiến ​​cho nhà nước, do đó làm chậm bạn xuống .

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

Tôi sẽ cố gắng đưa ra một ví dụ tối thiểu, mặc dù không dễ dàng bởi vì tôi cho rằng đó là do một số tương tác giao diện người dùng. Thỉnh thoảng đánh giá 'ScheduledTasks []' ngay sau khi 'Quit' cho hai nhiệm vụ, cả hai với id' 0'. – Szabolcs

+0

@Szabolcs Tôi sẽ không ngạc nhiên nếu id 0 được chỉ định cụ thể cho các nhiệm vụ liên quan đến hạt nhân. Các nhiệm vụ do người dùng định nghĩa bắt đầu từ 1. Có thể dễ dàng bao gồm một kiểm tra để loại trừ 0 (không cần thiết, vì 'myTask' sẽ có' id> 0') – abcd

+0

Khởi động Mathematica, và đánh giá một cái gì đó. Sau đó đánh giá 'Quit'. Sau đó, đánh giá 'ScheduledTasks []'. Tôi nhận được danh sách gồm ba phần tử, tất cả đều có ID 0: http://pastie.org/2778819 – Szabolcs

Các vấn đề liên quan