प्रश्न की लंबाई के लिए पहले से माफ़ी माफ़ी, मैं कुछ भी छोड़ना नहीं चाहता था।विराम (और अधिक) कार्यक्षमता को कैसे कार्यान्वित करें?
कुछ पृष्ठभूमि जानकारी
मैं Windows API का उपयोग करता है कीस्ट्रोक्स, माउस आंदोलन और खिड़की अनुकरण करने के लिए एक अजगर आवेदन लिख कर एक डेटा प्रविष्टि प्रक्रिया को स्वचालित करने/हेरफेर को नियंत्रित कोशिश कर रहा हूँ। मुझे इस विधि का सहारा लेना है क्योंकि मुझे अभी तक डेटास्टोर/डेटाबेस तक पहुंचने के लिए सुरक्षा मंजूरी नहीं है (उदाहरण के लिए एसक्यूएल का उपयोग करना) या अप्रत्यक्ष रूप से एक बेहतर उपयुक्त एपीआई के माध्यम से। नौकरशाही, यह एक दर्द है ;-)
डेटा प्रविष्टि प्रक्रिया में आलेख उपलब्धता में परिवर्तन के कारण बिक्री आदेशों में सुधार शामिल है। अनुपलब्ध लेख या तो ऑर्डर से हटा दिए जाते हैं या किसी अन्य उपयुक्त आलेख द्वारा प्रतिस्थापित किए जाते हैं।
प्रारंभ में मैं चाहता हूं कि एक मानव स्वचालित डेटा एंट्री प्रक्रिया की निगरानी करने में सक्षम हो, यह सुनिश्चित करने के लिए कि सब ठीक हो जाए। इसे प्राप्त करने के लिए मैं एक तरफ के कार्यों को धीमा कर देता हूं लेकिन उपयोगकर्ता को यह बताता हूं कि वर्तमान में पिन की गई विंडो के माध्यम से क्या चल रहा है।
वास्तविक प्रश्न
उपयोगकर्ता स्वचालन प्रक्रिया मैं एक हॉटकी के रूप में और हैंडलर मैं स्वचालन कार्यक्षमता रोकना चाहते हैं, उसमें रोकें/तोड़ कुंजी दर्ज की कर रहा हूँ को रोकने के लिए अनुमति देने के लिए। हालांकि, मैं वर्तमान में स्वचालन कार्यक्षमता के निष्पादन को ठीक से रोकने के लिए एक तरीका जानने के लिए संघर्ष कर रहा हूं। जब विराम समारोह का आह्वान किया जाता है, तो मैं चाहता हूं कि ऑटोमेशन प्रक्रिया अपने ट्रैक में मृत हो जाए, इससे कोई फर्क नहीं पड़ता कि यह क्या कर रहा है। मैं नहीं चाहता कि यह एक और कीस्ट्रोक निष्पादित भी करे।
अद्यतन [23/01]: मैं वास्तव में एक से अधिक बस को थामने करना चाहते हैं, मैं, जबकि यह चल रहा है स्वचालन की प्रक्रिया के साथ संवाद करने में सक्षम होने के लिए और चाहते हैं कि उसे रोक सकते हैं, वर्तमान बिक्री आदेश को छोड़ने के लिए अनुरोध करते हैं, पूरी तरह से और शायद और भी छोड़ दें।
क्या कोई मुझे मुझे प्राप्त करने के लिए सही रास्ता (टीएम) दिखा सकता है?
from pywinauto import application
app = application.Application()
app.start_("notepad")
app.Notepad.TypeKeys("abcdef")
अद्यतन [25/01]: पर काम करने का कुछ दिनों के बाद
कुछ अधिक जानकारी
यहाँ (मैं the pywinauto library उपयोग कर रहा हूँ) कैसे काम करता है स्वचालन का एक उदाहरण है मेरे आवेदन में मैंने देखा है कि मैं वास्तव में बहुत ज्यादा pywinauto का उपयोग नहीं करता हूं, अभी मैं केवल विंडो ढूंढने के लिए इसका उपयोग कर रहा हूं और फिर मैं माउस इनपुट अनुकरण करने के लिए कीबोर्ड इनपुट और win32api
फ़ंक्शंस को अनुकरण करने के लिए सीधे SendKeysCtypes.SendKeys
का उपयोग करता हूं।
मैं स्वचालन कार्यक्षमता को अलग कर सकता और:
मैं क्या बाहर मिल गया है अब तक
यहाँ कुछ तरीकों मैं एक जवाब के लिए मेरे खोज में अब तक का सामना करना पड़ा हैं दो अलग प्रक्रियाओं में इंटरफ़ेस + हॉटकी श्रोता। आइए पूर्व को "ऑटोमेटर" और बाद वाले को "प्रबंधक" के रूप में देखें। प्रबंधक तब एक सिग्स्टॉप सिग्नल को भेजकर ऑटोमेटर के निष्पादन को रोक सकता है और SIGCONT सिग्नल (या SuspendThread/ResumeThread के माध्यम से विंडोज समकक्ष) का उपयोग करके इसे रोक सकता है।
उपयोगकर्ता इंटरफ़ेस को अपडेट करने में सक्षम होने के लिए ऑटोमेटर को किसी भी प्रकार के आईपीसी तंत्र के माध्यम से इसकी प्रगति के प्रबंधक को सूचित करने की आवश्यकता होगी।
विपक्ष:
SIGSTOP का उपयोग कर सकते हैं एक छोटे से कठोर नहीं हो सकता है? क्या यह ठीक से काम करेगा? बहुत से लोग इसके खिलाफ सलाह दे रहे हैं और इसे "खतरनाक" भी कहते हैं।
मुझे चिंता है कि आईपीसी तंत्र को लागू करना थोड़ा जटिल होगा। दूसरी तरफ, मैंने डीबीस के साथ काम किया है जो लागू करने में बहुत मुश्किल नहीं होगा।
दूसरी विधि और एक कि बहुत से लोग सुझाव दे हो रहे हैं धागे का उपयोग करना शामिल है और अनिवार्य रूप को निम्नलिखित (सरलीकृत) पर निर्भर:
while True: if self.pause: # pause # Do the work...
हालांकि, यह इस तरह से यह लगता है कर ऐसा करने के लिए और कोई काम नहीं होने के बाद ही यह रोक देगा। इस विधि को देखने का एकमात्र तरीका काम करेगा (पूरे स्वचालन प्रक्रिया) को छोटे कार्य खंडों (यानी कार्य) में विभाजित करना होगा। एक नया कार्य शुरू करने से पहले कार्यकर्ता धागा जांच करेगा कि क्या इसे रोकना चाहिए और इंतजार करना चाहिए।
विपक्ष:
इस तरह के ऊपर एक के रूप में छोटे खंडों में काम को विभाजित करने, बहुत बदसूरत कोड बुद्धिमान (सौंदर्य की दृष्टि से) होगा एक कार्यान्वयन की तरह लगता है।
तरह से मैं यह कल्पना, सभी बयानों की तरह कुछ देखने के लिए तब्दील किया जाएगा:
queue.put((function, args))
(जैसेqueue.put((app.Notepad.TypeKeys, "abcdef"))
) और आप स्वचालित प्रक्रिया धागा कार्यों के माध्यम से चल रहा है और लगातार एक काम शुरू करने से पहले ठहराव राज्य के लिए जाँच होगा। यह सिर्फ सही नहीं हो सकता है ...कार्यक्रम वास्तव में अपने ट्रैक में मृत नहीं होगा, लेकिन वास्तव में पहले रोके जाने से पहले एक कार्य (हालांकि छोटा) खत्म कर देगा।
प्रगति
अद्यतन बनाया [23/01]: मैंने कहा SuspendThread/ResumeThread
कार्यक्षमता के माध्यम से पहली विधि का उपयोग कर अपने आवेदन के एक संस्करण क्रियान्वित किया है। अब तक यह बहुत अच्छी तरह से काम करता प्रतीत होता है और मुझे स्वचालन सामान लिखने की इजाजत देता है जैसे कि आप कोई अन्य स्क्रिप्ट लिखेंगे। एकमात्र क्विर्क जो मैंने पार किया है वह है कि कीबोर्ड संशोधक (CTRL, ALT, SHIFT) रोके जाने पर "अटक" हो जाते हैं। कुछ मैं आसानी से आसानी से काम कर सकते हैं।
मैंने दूसरी विधि (थ्रेड और सिग्नल/संदेश पासिंग) का उपयोग करके एक परीक्षण भी लिखा है और विराम कार्यक्षमता लागू की है। हालांकि, यह वास्तव में बदसूरत लग रहा है (दोनों विराम ध्वज की जांच और "काम करने" से संबंधित सब कुछ)। तो अगर कोई मुझे दूसरी विधि के समान कुछ का एक उचित उदाहरण दिखा सकता है तो मैं इसकी सराहना करता हूं।
संबंधित प्रश्नों
- Pausing a process?
Pausing a thread using threading class
Alex Martelli posted an answer कह रही:
अन्य थ्रेड जबरन एक धागा (किसी भी एक से अधिक वहाँ के लिए है को रोकने के लिए के लिए कोई तरीका नहीं है उस धागे को मारने के लिए अन्य धागे) - लक्ष्य धागे को मौका द्वारा सहयोग करना चाहिए सायनिक रूप से उचित "झंडे" की जांच (एक थ्रेडिंग। रोकें विराम/विवाद मामले के लिए उपयुक्त हो सकता है)।
तब उन्होंने मल्टीप्रोसेसिंग मॉड्यूल और सिगस्टॉप/सिगकंट को संदर्भित किया।
इस समारोह में मुख्य रूप से डिबगर द्वारा उपयोग के लिए बनाया गया है:
- Is there a way to indefinitely pause a thread?
-
An answer to this question SuspendThread के बारे में MSDN प्रलेखीकरण उद्धरण। यह थ्रेड सिंक्रनाइज़ेशन के लिए इस्तेमाल नहीं किया जाना है। सिंक्रनाइज़ेशन ऑब्जेक्ट का मालिक होने वाले थ्रेड पर सस्पेंड थ्रेड, जैसे म्यूटेक्स या महत्वपूर्ण सेक्शन, एक डेडलॉक का कारण बन सकता है यदि कॉलिंग थ्रेड एक निलंबित थ्रेड के स्वामित्व वाली सिंक्रनाइज़ेशन ऑब्जेक्ट प्राप्त करने का प्रयास करता है। इस स्थिति से बचने के लिए, एक ऐसे अनुप्रयोग के भीतर एक धागा जो डीबगर नहीं है, उसे अन्य थ्रेड को खुद को निलंबित करने का संकेत देना चाहिए। लक्ष्य धागा को इस सिग्नल को देखने और उचित प्रतिक्रिया देने के लिए डिज़ाइन किया जाना चाहिए।
- Is there any way to kill a Thread in Python?
- How do I pass an exception between threads in python
+1 – Wolph
GUI के लिए आप किस टूलकिट का उपयोग कर रहे हैं? आपने एक पिन की गई विंडो का उल्लेख किया है। –
@ क्रिस्टियन: मैंने क्यूटी को एक शॉट देने का फैसला किया, लेकिन मैं जीटीके पर वापस जाने के बारे में सोच रहा हूं। –