2009-02-04 19 views
5

Not:Arabirim işaretçisini bir iş parçacığına nasıl geçiririm?

  • ham Win32 CreateTheard kullanarak() API
  • Resim MFC bir arayüz sadece bir vtable

soru için bir işaretçi

  • :

    • Arabirim işaretçisini bir iş parçacığına nasıl geçirebilirim?

    Çizim:

    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 
    

    Selamlar

  • cevap

    8

    olarak güvenli olarak iplikleri arasında bir COM arabirim işaretçisi geçen aşağıda belirtilmiştir.

    varsayarsak ne yaptığını biliyorum:

    hThread = CreateThread(
           NULL, 
             0, 
             SecondaryThread, 
             (LPVOID) pis8 
             0, 
             &dwGenericThreadID); 
    
    DWORD WINAPI SecondaryThread(LPVOID iValue) 
    { 
        ((IS8Simulation*) iValue)->Open(); 
    } 
    

    Konu güvenli sürümü:

    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

  • threadthat bileşeni oluşturulan arayüz için kayıtlı bir mesaj döngüsü var ve işler vardır: Ancak, bu da gerektirir : Teşekkürler! – Aaron

  • +0

    Bu Arayüz Marshalling'e ihtiyaç duyar. – Vinay

    6

    sorunuzu arayüz COM arabirimi ise, Quassnoi tarafından verilen yaklaşım yeterli olmayabilir . Kullanımdaki COM nesnesinin diş çekme modeline dikkat etmeniz gerekir. İkincil iş parçacığı, COM nesnesinin oluşturulduğu bir COM apartmanına katılacak ve bu nesne apartman çevresi değilse, ikincil iş parçacığı bir proxy alır, böylece bu arabirim işaretçisini marshal gerekir ve nesneye doğrudan bir işaretçi değil.

    Bir COM nesnesi normalde IMarshal'ın özel bir uygulaması kullanılarak apartman çevresi yapılır. En basit yaklaşım Serbest Dişli Müdahaleciyi toplamaktır.

    Bazı yararlı linkler ...

    Güncelleme: Hakkında Serbest parçacıklı

    Bu yorumlardan anlaşılıyor ... Sıralayıcı Bu konuda bazı insanlar bunu tavsiye ederim FTM'ye asla dokunmazsın. "Etkin COM" mükemmel bir kitap olsa da, bazı tavsiyelerinin yoruma açık olduğunu düşünüyorum. Madde 33 "FTM'ye Dikkat" yazıyor; "FTM'yi asla kullanmayın" demez. Çok akıllıca, özellikle apartman çevrenizdeki nesneler diğer nesnelere referanslar koyduğunda dikkat etmenizi sağlar, çünkü onlar apartman çevresi olmayabilirler. Bu yüzden gerçekten tavsiye: çeviklik elde etmek için FTM'yi kullanıp kullanmadıkları olsun, apartman çevresi objeler oluştururken dikkatli düşünün. Bir apartman çevresi nesnesi inşa edebileceğinizden eminseniz, bunu başarmak için FTM'yi kullanmamanın bir nedenini göremiyorum.

    +0

    FTM'nin tehlikeli yönleri vardır (bkz. Etkili COM, madde 33, "Serbest Dişli Çubuklara Dikkat Edin") –

    +0

    GIT çok faydalıdır. –

    +0

    Evet, asla FTM kullanmayın ... –

    2

    Temelde aşağıdakileri yapmanız gerekir:

    • CoMashalInterThreadInterfaceInStream ==> Bir ıstream arabirimini olsun.
    • IStream iş parçacığına, örn. Quassnoi'nin dediği gibi. SecondaryThread içinde
    • , arabirimi (veya gerekirse bir proxy'yi) almak için CoGetInterfaceAndReleaseStream'u arayın.

    İş parçacığı oluşturulmadığı sürece, IStream arabirimini serbest bırakmayın ve yu, CoGetInterfaceAndReleaseStream olarak adlandırılana kadar iş parçacığından çıkmayın.

    COM çalışma zamanı otomatik olarak sizin için proxy oluşturur. Proxy, örn. apartman dişli bir COM bileşeni, onu oluşturan iş parçacığı üzerinde çağrılır.

    • arayüzü Idispatch veya proxy/saplama bileşenleri mesajları
    +0

    Bir "message loop" hakkında daha fazla bilgiyi nerede bulabilirim Win32 API: WaitForSingleObject()? – Aaron

    İlgili konular