2011-07-21 9 views
9

मैं सोच रहा था क्या बुला SendMessage (जो ब्लॉक) और WaitForSingleObject साथ संयोजन के रूप में PostMessage बुला के बीच का अंतर है। विचार?SendMessage बनाम PostMessage + WaitForSingleObject

+1

आप समक्रमिकता कॉल SendMessage चाहते हैं। –

उत्तर

17

SendMessage() अस्वीकार कर दिया जा सकता है, अगर आप इसे COM कॉल के संदर्भ में कहते हैं, जहां COM ऑब्जेक्ट एसटीए में रहता है (कॉल संदेश पंप के माध्यम से प्रेषित होते हैं)। PostMessage() COM अपार्टमेंट नियमों का पालन करने के लिए प्रतिबंधित नहीं है।

इसके अलावा, PostMessage() खिड़की के संदेश कतार के अंत पर संदेश डालता है। SendMessage() कतार को छोड़ देता है। आप रेमंड चेन के ब्लॉग The Old New Thing पर संदेश कतारों पर एक लंबी चर्चा पा सकते हैं।

मेरा मुद्दा यह है कि आंखों की तुलना में SendMessage() और PostMessage() के बीच अंतर के लिए और भी कुछ है। मैं वास्तव में रेमंड के ब्लॉग के माध्यम से जाने की सलाह देता हूं, क्योंकि उन्होंने पिछले कुछ वर्षों में कई गॉथस को कवर किया है।

4

PostMessage और WaitForSingleObject आप अतुल्यकालिक संदेश सेवा करने के लिए अनुमति देते हैं। आप एक संदेश भेज सकते हैं, अन्य चीजें कर सकते हैं, और बाद में उत्तर के लिए वापस जांच सकते हैं। SendMessage तुल्यकालिक है और आपको प्रतीक्षा करने की आवश्यकता है।

+0

मुझे लगता है कि मुझे यह उल्लेख करना चाहिए था कि मेरा लक्ष्य समकालिकता प्राप्त करना है। मैं PostMessage करता हूं और WaitForSingleObject को कॉल के साथ तुरंत पालन करता हूं। मुख्य परिचालन अंतर को हाइलाइट करने के लिए –

+0

+1 - एक ईवेंट पोस्ट करना और उस पर प्रतीक्षा करने से कॉलर प्रसंस्करण जारी रखने की अनुमति देता है। यह उपयोगी हो सकता है यदि लक्ष्य थ्रेड प्रोसेसिंग में कुछ बाद के चरण में इंतजार करना है जब तक कि पिछले पोस्ट किए गए संदेश को जीयूआई थ्रेड में पूरी तरह से संभाला नहीं जाता है। –

3

मैं हमेशा सोचा था कि SendMessage अपने विंडोज़ प्रक्रिया सीधे कॉल, संदेश कतार लंघन है; जबकि PostMessage बस कतार में संदेश जोड़ता है।

+3

यह निर्भर करता है कि क्या थ्रेड SendMessage() से कहा जाता है। इंटरथ्रेड कॉल हमेशा पंप के माध्यम से marshalled हैं, और सीधे Winproc को प्रेषित नहीं किया जाता है। –

2

SendMessage एक भी API कॉल, इसलिए कम अपने त्रुटियों की संभावना है। अपने आप को रोल करने के बजाय अंतर्निहित के साथ जाओ।

+3

ऐसा नहीं है कि यह त्रुटियों के लिए कम प्रवण है। कार्य एक बहुत ही अलग अर्थपूर्ण उद्देश्य प्रदान करते हैं। एक या दूसरे का उपयोग करने की आपकी पसंद उस चीज़ पर आधारित होनी चाहिए जो आप पूरा करना चाहते हैं, न कि मैं यह कोड "काम" कैसे कर सकता हूं। –

+0

"सेमेन्टिक्स" प्राकृतिक भाषाओं के लिए हैं। कोड वह कोड है, जो इसका मतलब नहीं है। –

+1

नहीं, कोड पठनीयता, स्वयं-दस्तावेज, और एपीआई अनुबंधों का पालन करने के लिए अर्थशास्त्र। सिर्फ इसलिए कि कोड कुछ करता है इसका मतलब यह नहीं है कि यह हमेशा वही काम करना जारी रखेगा। और सिर्फ इसलिए कि कार्यान्वयनकर्ता जानता है कि कोड का क्या अर्थ यह नहीं है कि बाद के रखरखावकर्ता को पता चलेगा कि आपने पूरी तरह से गैर-स्पष्ट, अनजान तरीके से कुछ क्यों किया। –

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