如何啟動 MFC ActiveX 控制項引發事件以 Visual C++ 中的第二個執行緒

文章翻譯 文章翻譯
文章編號: 157437 - 檢視此文章適用的產品。
附註Microsoft Visual C++ 2008年、 Microsoft Visual C++ 2005年及 Microsoft Visual C++.NET 2003年支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。
全部展開 | 全部摺疊

結論

MFC 架構的 ActiveX 控制項通常會引發其事件從相同的執行緒會實作接收介面來觸發該事件的容器。

有時候,很令人滿意,就會引發事件至容器的 ActiveX 控制項在開始第二個執行緒。 因為 MFC ActiveX 控制項使用公寓執行緒模型時引發事件從次要執行緒, 必須採取特殊的考量。

其他相關資訊

從 「 Microsoft 下載中心 」 下載下列檔案有:

Visual C++.NET

摺疊此圖像展開此圖像
Download
Download Fireevvcnet.exe now
發行日期: 2-Jul-2002

如需有關如何下載 Microsoft 支援檔案的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
119591如何從線上服務取得 Microsoft 的支援檔案
Microsoft 已掃描這個檔案有無病毒。Microsoft 使用已張貼檔案的日期中的 [可用的最新病毒偵測軟體。檔案儲存在安全性強化的伺服器上,協助防止未經授權的任何變更的檔案。 注意:-D 選項時使用執行 Fireev.exe 解壓縮檔案,並重新建立適當的目錄結構。

MFC ActiveX 控制項支援事件,方法是實作 IConnectionPointContainer 和 IConnectionPoint 的介面,以及提供其型別資訊中其事件介面的相關資訊。當 MFC ActiveX 控制項內嵌於支援事件的容器時,該容器將以動態方式建構接收介面具有所有其事件介面的控制項的型別資訊中所指定的方法。 一旦容器建構其接收介面,它會將指標傳遞至該 ActiveX 控制項的介面。ActiveX 控制項將會使用它實作 IConnectionPoint 通訊透過建構由容器現在攔截接接收器介面。這個範例將示範如何從第二個執行緒呼叫容器的接收器介面的方法。

兩個最重要事項,並啟動新執行緒時請考慮以引發來自 ActiveX 控制項的事件為:
  • MFC 架構的 ActiveX 控制項是在處理序物件 (在 DLL 中實作)。
  • MFC ActiveX 控制項使用公寓執行緒模型。
公寓執行緒模型指定想要使用 OLE 服務的所有執行緒必須在其執行緒,在使用 OLE 之前中都初始化 OLE 服務。而且,如果執行緒想要使用的介面,不論是實作由相同的程序的不同執行緒或封送已經被先前處理至不同的執行緒相同的程序的指標,該指標必須封送處理至提出要求的執行緒。公寓-執行緒模型、 隱藏的視窗中會建立同步處理要求來自其他執行緒所呼叫的執行緒。這表示所有執行緒之間的通訊將會都完成藉由使用公寓模型中的 [隱藏的視窗] 和 [Windows 訊息。

有兩個可能的方法引發事件從 ActiveX 控制項中的第二個執行緒 (或其他任何實作連接點,在公寓執行緒模式下的同處理序伺服器)。第一種是使介面呼叫事件接收器方法從第二個執行緒來從第二個執行緒呼叫。第二個是就緒引發該事件,並讓第一個執行緒火焰事件時,有第二個執行緒張貼訊息至第一個執行緒。

上述第一種方法並不是最佳的方式引發事件從第二個執行緒: 對於要引發事件的第二個執行緒,它必須初始化控制項的執行緒所持有的介面指標上進行呼叫。因此,將用來引發事件的介面指標必須封送處理至第二個會導致建立隱藏的視窗,以在執行緒之間進行通訊的 OLE 的執行緒。Windows 訊息將會用來在執行緒之間進行通訊。

MFC ActiveX 控制項架構不設定為很容易地引發事件,從第二個執行緒。可以覆寫預設 MFC 程式碼,以接收介面指標到第二個執行緒封送處理但不建議這樣做因為 Windows 要建立隱藏的視窗,並使用 PostMessage 仍要傳送執行緒之間的訊息。較為合理的第二個執行緒張貼自己的訊息,以第一個執行緒,並讓該引發事件的執行緒。這個程式碼可以設定輕鬆地在 MFC ActiveX 控制項。請使用下列步驟新增第二個執行緒所引發事件中 MFC ActiveX 控制項容器:
  1. 建立您的控制項專案。
  2. 使用 ClassWizard,加入方法,將啟動第二個執行緒,並傳回。下列程式碼示範方法,它會啟動第二個執行緒並立即傳回 MFC ActiveX 控制項中。全域函式來做為第二個執行緒的工作函式也宣告:
       LONG ThreadProc(LPVOID pParam);
    
       void CFireeventCtrl::StartLengthyProcess()
       {
         DWORD dwID;
         HANDLE threadHandle = CreateThread(NULL,NULL,
                               (LPTHREAD_START_ROUTINE)ThreadProc,
                               (LPVOID)this, NULL, &dwID);
         TRACE("Started the thread %x\n",dwID);
       }
    						
  3. 新增您想要從第二個執行緒使用 ClassWizard 引發任何事件。
  4. 定義要傳送從第二個執行緒的自訂訊息。 而且,收到自訂的訊息時,會呼叫訊息處理函式的控制項的訊息對應中加入訊息對應項目。此訊息處理常式會引發您想要的事件。範例如何執行這項操作中的 MFC ActiveX 控制項後面:
          //define a custom message:
          #define WM_THREADFIREEVENT WM_APP+101
    
          //add an entry for the message to the message map of the control
          BEGIN_MESSAGE_MAP(CFireeventCtrl, COleControl)
          //{{AFX_MSG_MAP(CFireeventCtrl)
          //}}AFX_MSG_MAP
          ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
          ON_MESSAGE(WM_THREADFIREEVENT,OnFireEventForThread) //custom handler
          END_MESSAGE_MAP()
    
          //add a handler for the custom message that will fire our event
          LRESULT CFireeventCtrl::OnFireEventForThread(WPARAM wParam,
              LPARAM lParam)
          {
            FireLengthyProcessDone();
            return TRUE;
          }
    						
  5. 在第二個執行緒的執行緒程序中的第二個執行緒來引發事件的時候,張貼回到主執行緒的步驟 3 中所定義的自訂訊息。將引發事件。下列程式碼會示範:
          LONG ThreadProc(LPVOID pParam)
          {
            Sleep(2000); //simulate lengthy processing
            CFireeventCtrl *pCtrl = (CFireeventCtrl*)pParam;
            PostMessage(pCtrl->m_hWnd,
                        WM_THREADFIREEVENT,
                        (WPARAM)NULL,
                        (LPARAM)NULL);
            return TRUE;
          }
請注意,在上述範例程式碼中 ActiveX 控制項的視窗控制代碼作為的目標來自第二個執行緒的訊息將會公佈。在大多數情況下一個 MFC 以基礎的 ActiveX 控制項在它的方法稱為,而且必須處理的視窗時,將會就地啟動。很可能不過,ActiveX 控制項不具有視窗控制代碼如視窗小於控制項的情況下的。若要解決這個問題的一個方法是建立隱藏的視窗,以用執行緒之間進行通訊。該視窗再終結,當執行緒結束時。FIREEV 範例具有已加上註解的程式碼取出在其 StartLengthyProcess 方法並 ThreadProc 執行緒示範如何建立視窗,做此用途 CMyWindow 類別所包裝的工時函式。也注意到 PostMessage 用來代替 PostThreadMessage。MFC 的訊息對應是設定來攔截只 CWinThread 衍生類別中的執行緒訊息。因為 MFC ActiveX 控制項衍生自 CWnd,它們將不會有 PostThreadMessage 路由到它們所傳送訊息。傳送 PostThreadMessage 訊息將會有 NULL hWnd。

屬性

文章編號: 157437 - 上次校閱: 2008年5月22日 - 版次: 8.0
這篇文章中的資訊適用於:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
關鍵字:?
kbmt kbsweptvs2008 kbactivexevents kbinfo kbdownload kbctrlcreate kbfile kbhowto kbinprocsvr KB157437 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:157437
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com