2011-10-29 7 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) में अंतिम प्रविष्टि यह इंगित करता है कि कार्य शुरू हो गया है या नहीं।

अब कार्य शुरू करें, और की सामग्री की तुलना 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[] झूठा दिखाता है। यह दर्शाता है कि चर वास्तव में कार्य वस्तु को पकड़ नहीं लेता है। परिवर्तनीय myTask को संशोधित करके हम सीधे कार्य को संशोधित नहीं कर सकते हैं। कार्य की वास्तविक स्थिति ScheduledTasks[] द्वारा वापस कर दी गई है।

यह मानना ​​उचित लगता है कि ScheduledTaskObject अभिव्यक्ति में पहली प्रविष्टि कार्य के अनुरूप एक अद्वितीय संख्या है। इसलिए किसी भी मैनुअल कार्य पर प्रदर्शन किया आपरेशन शायद एक "संभाल" के रूप में इस नंबर का उपयोग कर सकता है, और हम पहचानकर्ता 1 साथ कार्य की स्थिति की जांच कर सकता इस तरह:

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

मैं नहीं कर रहा हूँ बिल्कुल हालांकि यकीन है कि यह दृष्टिकोण (ScheduledTaskObject से पहचानकर्ता का उपयोग करके) सही है। मैंने परिस्थितियों को देखा है जब पहले से ही एक नए कर्नेल में कुछ कार्य थे (शायद सामने के अंत के कारण --- मेरे पास कई नोटबुक खुले थे, कुछ गतिशील तत्वों के साथ थे, और मैं कार्यों के साथ प्रयोग कर रहा हूं), और कभी-कभी ScheduledTasks[] कई कार्य एक ही पहचानकर्ता (आमतौर पर 0) के साथ।

सारांश में:

  1. यह (उनकी ScheduledTaskObject से पहले नंबर) अपने पहचानकर्ता द्वारा कार्यों को संभालने के लिए एक विश्वसनीय तरीका है?

  2. जब हम इसे पहली बार बनाते हैं तो CreateScheduledTask से प्राप्त अभिव्यक्ति को देखते हुए निर्धारित समय की स्थिति से पूछताछ करने का सही तरीका क्या है?

संपादित करें: तो यह संभव है, यह भी बहुत ज्यादा सीपीयू का उपयोग किए बिना, एक निर्धारित कार्य की स्थिति को दर्शाने वाला एक गतिशील सेल के लिए अच्छा होगा। क्या किसी के पास यह कैसे करना है इसके बारे में कोई विचार है?

उत्तर

5

ScheduledTaskObject के लिए प्रलेखन पहले तर्क के लिए id का उपयोग करता है और लगता है यह वास्तव में अद्वितीय है। मैं आपके द्वारा दावा किए जाने वाले एक ही आईडी के साथ कई 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

मैं एक न्यूनतम उदाहरण साथ आने के लिए, हालांकि यह आसान नहीं है, क्योंकि मेरा मानना ​​है कि यह कारण था कुछ सामने अंत बातचीत है की कोशिश करेंगे। कभी-कभी 'अनुसूचित जाति' के बाद 'अनुसूचित कार्य' [] 'का मूल्यांकन करने के बाद आईडी '0' दोनों के साथ दो कार्य दिए गए। – Szabolcs

+0

@Szabolcs मुझे आश्चर्य नहीं होगा अगर आईडी 0 विशेष रूप से कर्नेल से संबंधित कार्यों के लिए असाइन किया गया था। उपयोगकर्ता परिभाषित कार्य सभी 1 से शुरू होते हैं। 0 को बाहर करने के लिए केवल एक चेक शामिल करना आसान हो सकता है (जो आवश्यक नहीं होगा, क्योंकि 'MyTask' में 'id> 0' होगा) – abcd

+0

गणित प्रारंभ करें, और कुछ मूल्यांकन करें। फिर 'बाहर निकलें' का मूल्यांकन करें। फिर 'अनुसूचित कार्य [] 'का मूल्यांकन करें। मुझे तीन तत्वों की एक सूची मिलती है, सभी आईडी 0 के साथ: http://pastie.org/2778819 – Szabolcs