Wednesday 17 January 2018

प्रतीक्षाइएक्सिट उदाहरण सी खोल


कैसे प्रतीक्षा है WaitForExit () इसका मतलब यह है कि विकल्प का कोई भी विकल्प प्रतीक्षा को तोड़ने के लिए कर सकता है अन्यथा मैं अपने धागे को एक अलग समारोह में चलाऊंगा और इसे वैश्विक चर से नियंत्रित कर दूंगा। कारण - एक सीएमडी.एक्सई धागा, एक कंसोल अनुप्रयोग चल रहा है, जिसके चलते हम थ्रेड के पाठ्यक्रम से पहले ही रद्द करना चाहते हैं। यहां हमारे पास क्या है: प्रोसेस्टस्टाईटफ़ोई पीएसआई नई प्रोसेस्टस्टाइनफ़ो (उद्धरण सीएमडी.EXEquot, क्वेरी) psi. UseShellExecute उपयोग शेलएक्सएक psi. RedirectStandardOutput stdout psi. CreateNoWindow noWindow hbProc नई प्रक्रिया () hbProc प्रक्रिया। प्रारंभ (पीएसआई) hbProc. WaitForExit () ठीक है, आप कर सकते हैं उपयोग: जबकि (hbProc. WaitForExit (someTimeout)) अगर (दंडनैनल) को 1 9 सितंबर को 5:15 बजे टूट जाता है, तोक्मार्क ग्रेवैलक्ॉट ltmarc. grav। जीटी ने लिखा: gt अच्छी तरह से, आप इसका इस्तेमाल कर सकते हैं: gt gt जबकि (hbProc. WaitForExit (कुछ टाइमआउट)) gt (ifCancel) को gt gt gt gt gt मार्क (नोट करें), दोनों नई प्रक्रिया () और प्रक्रिया को कॉल करने का कोई कारण नहीं है प्रारंभ करें (पीएसआई) या आप इसका इस्तेमाल कर सकते हैं: एचबीपीआरसी नई प्रक्रिया () एचबीप्रक्र। सक्षम रीसाइजिंग ईवेंट्स सच्चे एचबीप्रक्र. एक्सित न्यू इवेंटहान्डलर (फ़ंक्शनटोकैल्फाप्रोसिट) एचबीप्रक्र। स्टार्टइन्फो पीएसआई एचबीप्रक्र। स्टार्ट () अन्य धागा- पर ईवेंट रद्द करना चाहते हैं: एचबीपीआरसी - नया इवेंटहैंडलर functionToCallAfterProcesit) किसी भी मामले में, बस प्रक्रिया समाप्त होने और प्रतीक्षा रद्द करने की इच्छा के बीच संभावित दौड़ की स्थिति से अवगत रहें। 1 9 सितंबर, 4:11 पर, एलिस्टेयर जॉर्ज लेटन। xtra. co. nzgt ने लिखा: gt कितनी स्थायी है WaitForExit ()। मेरा मतलब है कि जीटी वैकल्पिक कोई भी इंतजार को तोड़ने के लिए कर सकता है अन्यथा मैं एक अलग फ़ंक्शन में अपना धागा जीटी चलाऊंगा, और उसे वैश्विक चर से नियंत्रित कर सकूंगा। Gt कारण - एक सीएमडी.एक्सई थ्रेड, जिसमें कंसोल है आवेदन चल रहा है, जिसे हम जीआर को अपने कोर के चलते धागे से पहले रद्द करने की जरूरत है ई। gt यहां है जो हमारे पास है: gt प्रोसेस्टस्टाइनफ़ोई पीई नई जीपी प्रोसेस्टस्टाईटफ़ाईन (उद्धरण सीएमडी.एक्सएक्वाट, क्वेरी) gt psi. UseShellExecute का उपयोग करेंशेलएक्सएसीटी पीटी psi. RedirectStandardOutput stdout gt psi. CreateNoWindow noWindow gt hbProc नई प्रक्रिया () gt hbProc प्रक्रिया। स्टार्ट (पीई) gt hbProc. WaitForExit () gt gt, धन्यवाद, gt एलिस्टेयर। आप या तो धागा चल रहे WaitForExit () को मार सकते हैं या ओवरलोड का उपयोग कर सकते हैं जो आपको टाइमआउट बूल प्रतीक्षाफोरएक्सिट (इंट एमएसटॉवाइट) को निर्दिष्ट करने की अनुमति देता है। यदि आप इसे एक अलग थ्रेड में चलाते हैं और इसे मारते हैं तो आप एक बाधित अपवाद प्राप्त करने जा रहे हैं। आप यह सुनिश्चित करना चाह सकते हैं कि आपके द्वारा शुरू की गई प्रक्रिया अभी भी चल रही है (यदि वह है, इसे मारना)। gt आप या तो थ्रेड चल रहे WaitForExit () को मार सकते हैं या gt अधिभार का उपयोग कर सकते हैं जो आपको टाइमआउट बूल प्रतीक्षाफोरएक्सिट (इंट जीटी एमएसटॉवाइट) को निर्दिष्ट करने की अनुमति देता है। यदि आप इसे एक अलग थ्रेड में चलाते हैं और इसे मारते हैं तो gt एक बाधित अपवाद पाने के लिए जा रहे हैं। आप यह सुनिश्चित करना चाह सकते हैं कि आपने जो जीटी प्रक्रिया शुरू की है वह अभी भी नहीं चल रही है (यदि यह है, तो इसे मारना)। gt धन्यवाद के साथ लोग धन्यवाद जो उपयोगी हैं क्या विकल्प सबसे अच्छा काम करेगा सलाह देंगे अल। कॉपीराइट प्रतिलिपि 2005-2016, टेकटल्क्स सभी अधिकार सुरक्षित। कोड लगभग इस तरह दिखता है: जैसा कि आप देख सकते हैं, कोड एक cmd. exe प्रक्रिया शुरू करता है और उस आदेश को मैं निष्पादित करना चाहता हूं। मैं कोड से पढ़ने के लिए मानक ईर्रर और स्टैंडऑन आउटपुट को रीडायरेक्ट करता हूं। कोड प्रक्रिया से पहले उन्हें पढ़ता है WaitForExit (टाइमआउट) कॉल के रूप में Microsoft द्वारा अनुशंसित (और बाद में इस पर) समस्या तब उठती है जब मैं cmd. exe को भेजता हूं, कभी भी समाप्त नहीं होता है या अनिश्चित काल तक लटका रहता है। कोड में मैंने कमांड पिंग - t 8.8.8.8 का उपयोग किया था, जो - t ऑप्शन के कारण, बिना रोक के होस्ट को पिंग करता है। क्या होता है cmd. exe प्रक्रिया को ping - t कमांड के साथ कभी नहीं निकलता है और कभी भी stdout स्ट्रीम को बंद नहीं करता है और इसलिए हमारा कोड आउटपुट प्रक्रिया पर लटका हुआ है। StandardOutput. ReadToEnd () लाइन क्योंकि यह सभी स्ट्रीम को पढ़ने में सफल नहीं हो सकता। ऐसा भी होता है कि बैच फ़ाइल में किसी भी आदेश को किसी भी कारण से लटका दिया जाता है और इसलिए उपरोक्त कोड कई सालों तक लगातार काम कर सकता है और फिर बिना किसी स्पष्ट कारण के बिना अचानक लटका सकता है। इससे पहले कि मैंने लिखा था कि इसकी प्रक्रिया से पहले पुनः निर्देशित धाराओं को पढ़ने की सिफारिश की गई है। WaitForExit (टाइमआउट) कॉल, अच्छी तरह से यह विशेष रूप से सही है यदि आप टाइमआउट के बिना WaitForExit हस्ताक्षर का उपयोग करते हैं। यदि आप प्रक्रिया कॉल करते हैं रीडायरेक्ट स्ट्रीम पढ़ने से पहले WaitForExit (): कोड 2: यदि आप cmd. exe से जुड़ते हैं या आप जिस कॉल को कॉल करते हैं, तो मानक आउटपुट या मानक त्रुटि भरने पर आपको डेडलॉक का अनुभव हो सकता है यह इसलिए है क्योंकि हमारे कोड लाइनों तक पहुंच नहीं सकते हैं आउटपुट प्रक्रिया। मानक आउटपुट ReadToEnd () तथ्य की बात के रूप में बाल प्रक्रिया (पिंग कमांड या बैच फाइल या जो भी प्रक्रिया आप निष्पादित कर रहे हैं) खिचड़ी भाषा पर चलती है अगर हमारे प्रोग्राम में धाराओं के भरे बफ़र्स नहीं पढ़ा जाता है और ऐसा नहीं हो सकता क्योंकि कोड पर लटका हुआ है प्रक्रिया के साथ लाइन WaitForExit () जो बच्चे की परियोजना से बाहर निकलने के लिए हमेशा प्रतीक्षा करेंगे। दोनों धाराओं का डिफ़ॉल्ट आकार 4096 बाइट्स है। आप इन दो आकारों की इन बैच फ़ाइलों के साथ परीक्षण कर सकते हैं: पहला स्क्रिप्ट मानक आउटपुट के लिए 4096 बाइट्स लिखता है और मानक त्रुटि के लिए दूसरा है। इनमें से किसी एक को सी में सहेजें: testbuffsize. bat और हमारे प्रोग्राम कॉलिंग प्रक्रिया को चलाने के लिए। आउटपुट प्रक्रिया से पहले waitForExit () मानक आउटपुट कोड 2 में रीडटेन्ड () के रूप में आप इसे कमांड रिंगल्ट परिणाम ExecuteShellCommandSync (c: testbuffsize. bat, 1000) लिखकर कोड 13 की रेखा 13 पर लिख सकते हैं। कोड लटका नहीं है, लेकिन यदि आप दो धाराओं में से किसी एक में एक और बाइट लिखते हैं तो यह बफ़र आकार प्रोग्राम को बनाने में अतिप्रवाह करेगा लटका। यदि आपको मानक आउटपुट या स्टैंडर त्रुटि को रीडायरेक्ट करने और पढ़ने की आवश्यकता है तो सबसे अच्छा समाधान उन्हें एसिंक्रोनस तरीके से पढ़ना है। ऐसा करने का एक शानदार तरीका मार्क बॉयर्स द्वारा इस स्टैक ओवरफ्लो थैरे में प्रस्तावित किया गया है पिछले बात के अनुसार कृपया ध्यान दें कि अगर बच्चा प्रक्रिया केवल इसलिए निकलती है क्योंकि आप इस प्रक्रिया का उपयोग करते हैं। WaitForExit (टाइमआउट) हस्ताक्षर और यह वास्तव में टाइमआउट में चला जाता है, आपको सीएमडी.एक्सए प्रक्रिया और उसके संभावित बच्चों को मारना चाहिए।

No comments:

Post a Comment