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:
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ọ)?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?
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
@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
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