संक्षिप्त उत्तर कोई रास्ता मूल धागा एक में एक खिड़की के लिए धागा मोडल में एक खिड़की बनाने के लिए, भले ही धागे में एक ही प्रक्रिया में हैं है कि वहाँ है। यदि आपके पास दोनों विंडो के लिए कोड है, तो आप करीब आ सकते हैं, लेकिन उस स्थिति में आप अपने सभी UI को एक थ्रेड में डालकर प्रयास के लिए बेहतर परिणाम प्राप्त करेंगे।
यदि आप उपयोगकर्ता को सुझाव देने का प्रयास करते हैं कि थ्रेड बी की विंडो थ्रेड ए के लिए मोडल है, तो बहुत सारे सूक्ष्म जेड-ऑर्डर और सक्रियण व्यवहार हैं जिन्हें आपको सही होना है (जैसा कि आपने देखा है) ताकि आप एक अनजान पीड़ित न हों -वॉली प्रभाव, जहां यह उपयोगकर्ता के लिए स्पष्ट है कि थ्रेड बी की खिड़की ऐसा कुछ करने की कोशिश कर रही है जो ऐसा नहीं है और इसलिए टूटा हुआ लगता है।
कि बचने के लिए, मैं इस दृष्टिकोण ले जाएगा:
- उपयोगकर्ता canner.exe की मुख्य विंडो में "एफडीए निरीक्षण" क्लिक करता है। canner.exe एक मॉडल संवाद दिखाता है जो दर्शाता है कि यह एक बाहरी प्रोग्राम खोल रहा है ("बोटुलिज्म सेटिंग्स खोलना ...")। यह मुख्य विंडो इत्यादि को अक्षम करता है ताकि उपयोगकर्ता जानता है कि एक मोडल इंटरैक्शन हो रहा है।
- canner.exe botulism.exe शुरू करने के लिए ShellExecuteEx() पर कॉल करता है।
- canner.exe संभाल ShellExecuteEx से लौटे WaitForInputIdle() पर कॉल()। WaitForInputIdle() वापस आ जाएगा (लगभग, लेकिन आमतौर पर पर्याप्त बंद) जब botulsim.exe उपयोगकर्ता इंटरैक्शन के लिए तैयार है। यदि botulism.exe आमतौर पर इसके UI को दिखाने के लिए पांच या अधिक सेकंड लेता है, तो मैं लूप में WaitforInputIdle() के साथ एक छोटा टाइमआउट का उपयोग कर सकता हूं और कभी-कभी PeekMessage()/ProcessMessage() के साथ किसी भी लंबित संदेशों को संसाधित करता हूं।
- canner.exe अपने संवाद पाठ में परिवर्तन है कि यह botulism.exe बंद करने के लिए उपयोगकर्ता के लिए प्रतीक्षा कर रहा है को प्रतिबिंबित करने के ("जारी रखने के लिए बंद बोटुलिज़्म सेटिंग्स ...")।
- canner.exe तक botulsim.exe बंद कर देता है प्रतीक्षा करने के लिए MsgWaitForMultipleObjects() एक पाश में कहता है। MsgWaitForMultipleObjects() वापस आ जाएगा जब हैंडल पास किए गए हैं या जब थ्रेड की कतार में संदेश प्रतीक्षा कर रहे हैं।
- उपयोगकर्ता जबकि canner.exe इंतज़ार कर रहा है canner.exe के मॉडल संवाद में करीब बॉक्स क्लिक करता है, canner.exe उपयोगकर्ता कि botulism.exe अभी भी चल रहा है का संकेत देता है ("बोटुलिज़्म सेटिंग्स अभी भी खुला है, फिर भी जारी?", " हाँ, मुझे पता है "या" नहीं, मैं नहीं कर रहा ")। अगर पुष्टि हुई है, तो canner.exe संवाद बंद कर देता है और मूल FDA निरीक्षण चरण 1 में शुरू होता है और मुख्य विंडो के संदेश पाश पर लौटता है।
- MsgWaitForMultipleObjects() इंगित करता है कि botulism.exe समाप्त हो गया है, canner.exe संवाद बंद और एफडीए निरीक्षण के साथ सामान्य रूप से जारी है चरण में 1.
इस तरह शुरू कर दिया, अगर सब कुछ सामान्य रूप से और जल्दी से, आगे बढ़ता है बातचीत अच्छी तरह से निर्बाध हो सकती है, लेकिन अगर बच्चे की प्रक्रिया में कुछ गलत हो जाता है या जेड-ऑर्डर बदल जाता है, तो यह स्पष्ट होगा कि माता-पिता की प्रक्रिया क्यों इंतजार कर रही है और उपयोगकर्ता को या तो रद्द करने या आगे बढ़ने के लिए क्या करना है कार्य शुरू किया।
स्रोत
2009-03-10 01:23:12
अनुरोधित संपादन: शीर्षक में परिवर्तन "मैं अपनी प्रक्रिया में मोडल प्रकट करने के लिए एक बाल प्रक्रिया विंडो कैसे बना सकता हूं?"। आपका वर्तमान शीर्षक एक बच्चे विंडो मोडल बनाने और अपनी विंडो को दूसरी प्रक्रिया में इंजेक्ट करने के बीच अंतर को प्रतिबिंबित नहीं करता है (सेटपेरेंट() देखें –