2009-02-04 9 views
5

नोट:किसी थ्रेड पर इंटरफ़ेस पॉइंटर कैसे पास करें?

  • कच्चे Win32 CreateTheard का उपयोग करना() API
  • कोई MFC
  • एक इंटरफेस सिर्फ एक vtable

प्रश्न के लिए सूचक है:

  • किसी थ्रेड पर इंटरफ़ेस पॉइंटर कैसे पास करें?

उदाहरण:

IS8Simulation *pis8 = NULL; 

... 

CoCreateInstance(
       clsid, 
       NULL, 
       CLSCTX_LOCAL_SERVER, 
       __uuidof(IS8Simulation), 
       (void **) &pis8); 



... 

hThread = CreateThread(
       NULL, 
       0, 
       SecondaryThread, 
       //interface pointer pis8 
       0, 
       &dwGenericThreadID); 

... 

DWORD WINAPI SecondaryThread(LPVOID iValue) 
{ 
    //using iValue accordingly 
    //E.g.: iValue->Open 

सादर

उत्तर

8

के रूप में नीचे वर्णित किया गया था, सुरक्षित नहीं में धागे के बीच एक COM इंटरफ़ेस सूचक गुजर।

मान लें कि आप जानते हैं कि आप क्या कर रहे हैं:

hThread = CreateThread(
       NULL, 
         0, 
         SecondaryThread, 
         (LPVOID) pis8 
         0, 
         &dwGenericThreadID); 

DWORD WINAPI SecondaryThread(LPVOID iValue) 
{ 
    ((IS8Simulation*) iValue)->Open(); 
} 

थ्रेड सुरक्षित संस्करण:

void MainThread() 
{ 
    IStream* psis8; 
    HRESULT res = CoMarshalInterThreadInterfaceInStream (IID_IS8SIMULATION, pis8, &psis8); 
    if (FAILED(res)) 
     return; 
    hThread = CreateThread(
       NULL, 
       0, 
       SecondaryThread, 
       (LPVOID) psis8 
       0, 
       &dwGenericThreadID 
     ); 
} 

DWORD WINAPI SecondaryThread(LPVOID iValue) 
{ 
    IS8Simulation* pis8; 
    HRESULT res = CoGetInterfaceAndReleaseStream((IStream*) iValue, IID_IS8SIMULATION, &pis8); 
    if (FAILED(res)) 
     return (DWORD) res; 
    pis8->Open(); 
} 
+0

@Quassnoi कर रहे हैं : धन्यवाद! – Aaron

+0

इस इंटरफ़ेस मार्शलिंग की आवश्यकता है। – Vinay

6

अपने प्रश्न में इंटरफ़ेस एक COM इंटरफेस है, तो दृष्टिकोण Quassnoi द्वारा दिए गए पर्याप्त नहीं हो सकता है । आपको उपयोग में COM ऑब्जेक्ट के थ्रेडिंग-मॉडल पर ध्यान देना होगा। यदि द्वितीयक धागा एक अलग COM अपार्टमेंट में शामिल होगा जिसमें आपकी COM ऑब्जेक्ट बनाई गई थी, और यदि वह ऑब्जेक्ट अपार्टमेंट-एग्इल नहीं है, तो आपको उस इंटरफ़ेस पॉइंटर को मार्शल करना होगा ताकि माध्यमिक थ्रेड प्रॉक्सी हो , और वस्तु के लिए एक प्रत्यक्ष सूचक नहीं है।

एक COM ऑब्जेक्ट आम तौर पर इमरशाल के विशेष कार्यान्वयन का उपयोग करके अपार्टमेंट-फुर्ती बना दिया जाता है। सबसे आसान तरीका फ्री थ्रेडेड मार्शलर को एकत्र करना है।

कुछ उपयोगी लिंक्स ...

अद्यतन: के बारे में नि: शुल्क-थ्रेडेड Marshaler ...

यह टिप्पणी से स्पष्ट है इस विषय पर कुछ लोग इसकी सिफारिश करेंगे आप कभी भी एफटीएम को छूते नहीं हैं। जबकि "प्रभावी COM" एक उत्कृष्ट पुस्तक है, मुझे लगता है कि इसकी कुछ सिफारिशें व्याख्या के लिए खुली हैं। आइटम 33 कहता है "एफटीएम से सावधान रहें"; यह नहीं कहता है "कभी भी एफटीएम का उपयोग न करें"। बहुत बुद्धिमानी से यह सावधानी बरतता है जब विशेष रूप से आपके अपार्टमेंट-फुर्तीली वस्तु में अन्य वस्तुओं के संदर्भ होते हैं, क्योंकि वे अपार्टमेंट-फुर्ती नहीं हो सकते हैं। तो वास्तव में सलाह है: अपार्टमेंट-फुर्तीली वस्तुओं का निर्माण करते समय ध्यान से सोचें, चाहे वे अपनी चपलता प्राप्त करने के लिए एफटीएम का उपयोग करें या नहीं। यदि आप सुनिश्चित हैं कि आप एक अपार्टमेंट-फुर्तीली वस्तु का निर्माण कर सकते हैं, तो मुझे कोई कारण नहीं दिखता कि आप इसे प्राप्त करने के लिए एफटीएम का उपयोग क्यों नहीं करेंगे।

+0

एफटीएम में खतरनाक पहलू हैं (प्रभावी COM देखें, आइटम 33, "फ्री थ्रेडेड मार्शलर से सावधान रहें") –

+0

हालांकि जीआईटी बहुत उपयोगी है। –

+0

हाँ, कभी भी एफटीएम का उपयोग न करें ... –

2

आप मूल रूप से निम्नलिखित कार्य करने होंगे:

  • CoMashalInterThreadInterfaceInStream ==> आप एक IStream इंटरफ़ेस मिलता है।
  • थ्रेड पर आईएसट्रीम पास करें, उदा। Quassnoi के रूप में कहा। इंटरफ़ेस प्राप्त करने के लिए
  • , इंटरफ़ेस प्राप्त करने के लिए CoGetInterfaceAndReleaseStream पर कॉल करें (या यदि आवश्यक हो तो प्रॉक्सी)।

थ्रेड विफल होने तक आईएसट्रीम इंटरफ़ेस को रिलीज़ न करें, और जब तक आप CoGetInterfaceAndReleaseStream कहलाते हैं तब तक थ्रेड से बाहर न निकलें।

COM रनटाइम स्वचालित रूप से आपके लिए प्रॉक्सी बनाएगा। प्रॉक्सी सुनिश्चित करता है कि उदा। एक अपार्टमेंट थ्रेडेड COM घटक को धागे पर बुलाया जाता है जिसने इसे बनाया है। बहरहाल, यह भी जरूरी है कि:

  • इंटरफ़ेस IDispatch, या प्रॉक्सी है/ठूंठ घटक अंतरफलक
  • threadthat घटक बनाया के लिए पंजीकृत संदेश पाश है और प्रक्रियाओं संदेशों
+0

मुझे "संदेश लूप" के बारे में अधिक जानकारी कहां मिल सकती है जो Win32 API: WaitForSingleObject() के समान है? – Aaron

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