2009-01-16 9 views
5

का उपयोग कर थ्रेड संचार मेरा प्रश्न है: मैं दो धागे के बीच थ्रेड संचार को लागू करने के लिए SendMessage() का उपयोग कैसे कर सकता हूं, एक खिड़की (जीयूआई) के साथ और दूसरा खिड़की के साथ?SendMessage

समस्या यह है कि SendMessage() को एक हैंडल (एचडब्ल्यूएनडी) की आवश्यकता है?

अपने प्रोजेक्ट के बारे में एक विस्तार: दो धागे, एक चल रहा है कोड (यूजर इंटरफेस के साथ) में कामयाब रहे, और अन्य चल मूल कोड (खिड़की के बिना एक)

आपको बहुत बहुत धन्यवाद!

+0

SendMessage एक अविश्वसनीय रूप से खतरनाक समारोह एक मल्टी-थ्रेडेड वातावरण में उपयोग किया है क्योंकि यह सुरक्षित थ्रेड नहीं है और गतिरोध में परिणाम कर सकते (मैं से बात है अनुभव)। –

उत्तर

3

शायद आप तो यह यह करने के लिए संदेश मुश्किल हो जा रहा है, धागा कोई खिड़की, कोई संदेश कतार, और कोई संदेश डिस्पैचर है PostMessage या PostThreadMessage

+0

मुझे PostThreadMessage बहुत पसंद है। क्या इस फ़ंक्शन का अवरोधक संस्करण है? क्योंकि PostThreadMessage संदेश को संसाधित करने के लिए कैली के इंतजार किए बिना लौटाता है। –

+0

नहीं। ब्लॉकिंग संस्करण को कार्यान्वित करना बहुत मुश्किल नहीं होगा - PostThreadMessage का उपयोग करें, और उसके बाद कॉलिंग थ्रेड ब्लॉक उस ईवेंट पर हो जिसे कैली सेट करेगा जब उसने संदेश संसाधित किया होगा –

2

उपयोग करने के लिए प्रयास करना चाहिए। धागे के लिए संचार उद्देश्यों के लिए छिपी हुई खिड़कियां बनाना आम बात है (विंडोज जासूस के साथ एक नज़र डालें और आपको बहुत सारे उदाहरण दिखाई देंगे)।

एक विकल्प साझा स्मृति का उपयोग करना और सिंक्रनाइज़ेशन आदिम ऐसी घटना या सेमफोर का उपयोग करना है। पाइप का उपयोग करने का एक और विकल्प है।

2

क्या @jdigital ने कहा। ध्यान दें कि यदि आप एक छिपी हुई विंडो बनाते हैं, और आपका धागा पहले से ही एक संदेश लूप को लागू नहीं करता है (या तो नियमित Win32-speak में, या COM STA के संदर्भ में एक - और यदि आपको पता नहीं है कि मैं किस बारे में बात कर रहा हूं तो शायद आपके धागे में मौजूद नहीं है), आप भी एक संदेश लूप बनाना चाहते हैं। एटीएल _AtlModule.RunMessageLoop(); के साथ इसे काफी आसान बनाता है दुर्भाग्यवश इसका मतलब यह भी है कि प्रश्न में धागे को संदेश लूप में होने पर ईवेंट-संचालित होने की आवश्यकता होगी। आप MsgWaitForMultipleObjects जैसी मुश्किल चीजें कर सकते हैं, लेकिन यह बालों वाली हो जाता है।

यदि आप एटीएल/कॉम से परिचित हैं तो hidden windows का उदाहरण यहां दिया गया है। मैं थोड़ी देर पहले इस दर्द से गुजर गया और सोचा कि microsoft.public.vc.atl पर एक उपयोगी चर्चा हुई थी, लेकिन अब मुझे सबसे अच्छा मिल सकता है this post। जो संदेश लूप के रूपों के बारे में कुछ विस्तार में जाता है (यदि आपके पास कीस्ट्रोक एक्सीलरेटर या मॉडलस विंडो हैं तो अलग-अलग क्या करें, ऐसा लगता है जैसे आप अपने आवेदन में नहीं हैं)।

4

मैं एक छिपी हुई खिड़की बनाने का सुझाव दूंगा। Postthreadmessage का उपयोग करते समय, एक मौका है कि आपका संदेश गुम हो सकता है (यानी: यदि कोई संदेशबॉक्स संदेश लूप चला रहा है)। के बारे में

और जानकारी है कि कम से:

http://blogs.msdn.com/oldnewthing/archive/2005/04/26/412116.aspx

संबंधित मुद्दे