सी- मानक - उत्पादन - waitforexit - does not को - इंतजार


मैं प्रक्रिया का उपयोग करता हूं.एक बैच फ़ाइल शुरू करने के लिए प्रारंभ करें बैच फ़ाइल समानांतर में कई प्रोग्राम शुरू करने के लिए START कमांड का उपयोग करती है और फिर बाहर निकलती है। एक बार बैच फ़ाइल की प्रक्रिया हो जाती है। प्रक्रिया समाप्त हो जाती है और प्रक्रिया हो जाती है। एक्सेटकोड में सही निकास कोड होता है। लेकिन जब मैं प्रक्रिया को बुलाता हूं। वेटफॉरएक्सिट () यह कभी भी रिटर्न नहीं देता। कोड का निम्नलिखित भाग समस्या दर्शाता है यह एक बैच फ़ाइल बनाता है, इसे शुरू करता है और फिर प्रिंट करता है: इसे तब प्रिंट करना चाहिए: लेकिन यह कभी नहीं करता (भले ही हेटेक्ज़िटेड सत्य है और हमारे पास पहले से ही एक ExitCode है) मैंने देखा कि यह केवल तभी होता है जब बैच फ़ाइल START कमांड में होती है और जब मानक आउटपुट और मानक त्रुटि को रीडायरेक्ट किया जाता है। क्यों WaitForExit () कभी नहीं लौटा है इस प्रक्रिया से बाहर निकलने के लिए इंतजार करने का सही तरीका क्या है यह सिर्फ चुनाव प्रक्रिया के लिए सुरक्षित है। मैंने देखा है कि एक बड़ी समय समाप्ति के साथ प्रतीक्षाकर्ता (100000) को कॉल करना (जो निश्चित रूप से समाप्त नहीं होता है) प्रक्रिया पूरी होने पर तुरंत रिटर्न मिलता है अजीब। समयबाह्य बिना इसे लटका दिया। जब आप टाइम-आउट के बिना WaitForExit () को कॉल करते हैं, तो यह मूलभूत अंतर होता है, यह सुनिश्चित करता है कि पुनर्निर्देशित स्टडॉटर ने आईओएफ वापस कर दिया है। यह सुनिश्चित करता है कि आप प्रक्रिया द्वारा उत्पादित सभी आउटपुट को पढ़ते हैं। हम यह देख सकते हैं कि quotonOutputquot क्या करता है, लेकिन उच्च बाधाएं यह आपके कार्यक्रम को खारिज करती हैं क्योंकि यह मानते हुए कि आपका मुख्य थ्रेड बेकार है, जब यह वास्तव में WaitForExit () में फंस गया है। ndash हंस पासंत 3 नवम्बर 12:06 यह मानक ऑटपुट और स्टैंडर्ड एरर के ईवेंट-आधारित एसिंक्रोनस हैंडलिंग के विशिष्ट कार्यान्वयन में एक आर्टिफैक्ट (आईडी बग) लगता है। मैंने देखा है कि जब तक मैं आसानी से आपकी समस्या को पुन: उत्पन्न करने में सक्षम था, बस आपके द्वारा प्रदान किए गए कोड को चलाने के द्वारा (उत्कृष्ट कोड उदाहरण, जिस तरह से।)), प्रक्रिया वास्तव में अनिश्चित काल तक लटका नहीं आई थी दरअसल, बच्ची की दो प्रक्रियाओं को शुरू होने के बाद, यह प्रतीक्षाफॉरएक्सिट () से लौटा था खुद को बाहर निकल गया था। यह प्रक्रिया वर्ग के कार्यान्वयन का जानबूझकर भाग माना जाता है। विशेष रूप से, Process. WaitForExit () विधि में, प्रक्रिया समाप्त होने के बाद, प्रक्रिया को स्वयं ही संभाल कर लेता है, यह देखने के लिए जांचता है कि क्या स्टडआउट या स्टेडरर के लिए कोई पाठक बनाया गया है यदि ऐसा है, और यदि WaitForExit के लिए टाइमआउट मान ) कॉल अनंत है (यानी -1), वास्तव में पाठक के अंत के लिए इंतजार कर रहा है, पाठक (ओं) पर प्रत्येक संबंधित रीडर को केवल तब ही बनाया जाता है जब BeginOutputReadLine () या BeginErrorReadLine () विधि को कहा जाता है। Stdout और stderr धाराएं स्वयं तक बंद नहीं होती जब तक कि बाल प्रक्रियाओं को बंद नहीं किया जाता है। इसलिए उन धाराओं के अंत तक इंतजार करना बंद हो जाएगा, जब तक ऐसा नहीं होता। वह WaitForExit () को अलग तरीके से व्यवहार करना चाहिए, इसके आधार पर कि क्या किसी ने ऐसे तरीकों को बुलाया है जो धाराओं के ईवेंट-आधारित रीडिंग को शुरू करते हैं या नहीं, और विशेष रूप से उन धाराओं को सीधे पढ़ते हुए प्रतीक्षाफॉरएक्सिट () इस तरह से व्यवहार करने का कारण नहीं है, एपीआई में एक असंगति है जो इसे समझने और उपयोग करने में अधिक मुश्किल बनाता है। जबकि आईडी व्यक्तिगत रूप से इसे एक बग कहते हैं, मुझे लगता है कि यह संभव है कि प्रक्रिया वर्ग के क्रियान्वयनकर्ता इस असंगति से अवगत हैं और इसे उद्देश्य पर बनाया है। किसी भी स्थिति में, एपीआई के ईवेंट-आधारित भाग का उपयोग करने के बजाय कार्य-आसपास मानक-आउटपुट और मानक ईर्रर को सीधे पढ़ना होगा। (हालांकि जाहिर है, यदि उन कोडों पर इंतजार करना होता है, तो एक ही अवरुद्ध व्यवहार को तब तक देखेगा जब तक बच्चे की प्रक्रिया बंद नहीं हो जाती।) उदाहरण के लिए (सी, क्योंकि मुझे एफ़ अच्छी तरह से पता नहीं है कि इस तरह से एक उदाहरण उदाहरण के रूप में थप्पड़ मारना है :)): उम्मीद है कि उपर्युक्त कार्य-आस-पास या कुछ इसी तरह के मूल मुद्दे को संबोधित करेंगे जो आप में चलेंगे मेरा सुझाव है कि नील्स वोर्गार्ड क्रिस्टेंसेन ने मुझे WaitForExit () विधि में समस्याग्रस्त लाइनों पर निर्देशन करने के लिए, ताकि मैं इस उत्तर में सुधार कर सकूं। मेरी समझ के आधार पर, Process. WaitForExit (int32) विधि का समय निकालने का मतलब नहीं है WaitForExit (Int32) ओवरलोड का उपयोग वर्तमान थ्रेड को समाप्त करने तक किया जाता है जब तक कि संबद्ध प्रक्रिया समाप्त नहीं होती है। यह अधिभार प्रक्रिया के घटक को बाहर निकलने के लिए समय की एक सीमित मात्रा में इंतजार करने के लिए निर्देश देता है। यदि संबद्ध प्रक्रिया अंतराल के अंत तक बाहर नहीं निकलती क्योंकि समाप्त करने का अनुरोध अस्वीकार कर दिया गया है, तो झूठी कॉलिंग प्रक्रिया में वापस आ जाता है। आप मिलीसेकंड के लिए एक नकारात्मक संख्या (अनंत) निर्दिष्ट कर सकते हैं। और प्रक्रिया WaitForExit (Int32) WaitForExit अधिभार के समान व्यवहार करेगा यदि आप इस प्रक्रिया को बंद करना चाहते हैं, तो आप निम्न कोड का उपयोग करने के लिए कर सकते हैं जैसे कि आप चाहते हैं: विन जिन MSFT एमएसडीएन समुदाय का समर्थन हमें प्रतिक्रिया प्राप्त करें या अनुरोध कोड का नमूना Microsoft से कृपया याद रखें जवाब के रूप में उत्तरों को चिह्नित करने के लिए अगर वे मदद करते हैं और उन्हें अचिह्नित करते हैं, यदि वे कोई सहायता प्रदान नहीं करते हैं सोमवार, 20 जून, 2011 6:26 पूर्वाह्न हाँ, लेकिन इसकी प्रक्रिया नहीं। वेटफॉरएक्सिट (इंट 32) जो काम नहीं करती। यह फ़ंक्शन निष्पादन योग्यता के साथ बहुत अच्छी तरह से काम करता है। समस्या यह है कि यह फ़ंक्शन PsExec और एक मानक आउटपुट रीडायरेक्शन के साथ काम नहीं करता। इसका काम बिना किसी रीडायरेक्शन का उपयोग किए बिना या टाइमआउट का उपयोग किए बिना सोमवार, 20 जून, 2011 6:41 पूर्वाह्न मुझे यकीन नहीं है कि आप महत्वपूर्ण कार्य का उपयोग क्यों करना चाहते हैं और आप इसे केवल तब ही रीडायरेक्ट करना चाहते हैं जब निम्न कोड की कोशिश करें: इसे अपने अनुरोध के रूप में संशोधित करें। यह अच्छी तरह से काम कर सकता है यहां परिणाम दिया गया है: आपके द्वारा सेट किए गए समय (120000) जितनी अधिक हो, उतनी अधिक जानकारी जो आपको मिलेगी। इसलिए मैं आपको पैरामीटर के बिना process. WaitForExit () विधि का उपयोग करने का सुझाव देता हूं। धन्यवाद। विन जिन एमएसएफटीएस एमएसडीएन सामुदायिक सहायता हमें प्रतिक्रिया प्राप्त करें या प्राप्त करें कोड का नमूना माइक्रोसॉफ्ट से कृपया उत्तर को जवाब के रूप में चिह्नित करने के लिए याद रखें यदि वे मदद करते हैं और उन्हें खारिज कर देते हैं यदि वे कोई मदद नहीं देते हैं सोमवार, 20 जून, 2011 9:42 AM आपकी मदद के लिए धन्यवाद अगर मैं बिना समय के process. WaitForExit () का उपयोग करता हूं, इसका काम बहुत अच्छी तरह से है और मेरे पास पूर्ण आउटपुट है। लेकिन मैं एक सेटअप किट को दूरस्थ रूप से चलाने के लिए psexec का उपयोग करता हूं, यह सेटअप प्रक्रिया को फ्रीज कर सकता है, इसलिए मुझे समय समाप्त होने की आवश्यकता है और मुझे - d विकल्प (न खत्म होने की प्रक्रिया के लिए इंतजार करना) का उपयोग करना नहीं है क्योंकि मेरे पास अगले चरण हैं स्थापित करना। सोमवार, 20 जून, 2011 10:01 AM समय के बारे में अधिक समय निर्धारित करने के बारे में कृपया इसे उत्तर के रूप में चिह्नित करें, अगर यह आपकी समस्या को हल करने में मदद करता है बुधवार, 22 जून, 2011 07:07 पूर्वाह्न मैंने 300000 के साथ कोशिश की, इसका एक ही व्यवहार। यद्यपि मेरी सेटअप प्रक्रिया 6000000 से कम लेती है समस्या समस्या का समयबाह्य अवधि नहीं है समस्या यह है कि एक मानक आउटपुट रीडायरेक्शन और टाइमआउट के साथ एक निष्पादन प्रक्रिया psexec (केवल psexec, एक और नहीं।) बुधवार, 22 जून, 2011 7:19 पूर्वाह्न, मुझे पता है कि यह काफी पुरानी पोस्ट है, लेकिन मैं था यह वही त्रुटि है जब कॉम्बो वेफफॉर () 43 रीडायरेक्ट मानकऑप्टपुट का उपयोग करके एक प्रक्रिया निष्पादित करने का प्रयास करते हैं और यह अनिश्चित काल तक लटकाएगा। मुझे लूसियन विस्कीक, एमएसएफटी से एक ब्लॉग पोस्ट में अपनी समस्या का समाधान मिला। यदि आपको कोई हल मिल गया है, या किसी और को खोज करने वाले किसी और को इस पते पर नज़र रखना चाहिए: यहां उनके कोड की एक प्रति है जो लगभग सी में अनुवादित है। बुधवार, 30 नवंबर, 2011 10:23 PM माइक्रोसॉफ्ट एक ऑनलाइन सर्वेक्षण आयोजित कर रहा है एमएसडीएन वेब साइट की आपकी राय को समझने के लिए यदि आप भाग लेना चुनते हैं, तो ऑनलाइन सर्वेक्षण आपको प्रस्तुत किया जाएगा जब आप एमएसडीएन वेब साइट छोड़ देंगे। क्या आप भागीदारी करना चाहेंगे

Comments