首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

软件资讯设计 工具 系统 开发 安全 办公 陶吧 IT教育 Vista频道 | 下载中心酷我音乐盒 腾讯QQ
天极网 > 开发频道>COM接口在不同线程中的传递技巧两则

COM接口在不同线程中的传递技巧两则

2005-06-02 11:09作者:激烈振动出处:博客园责任编辑:方舟

  用窗口消息解决COM接口的多线程访问问题

  但有时候我们不能直接访问接口指针,而是通过一个封装类间接的访问。比如:

class SomeClass
{
 private:
  IMyInterface *m_pInt;
 public:
  void Method1()
  {
   //Init m_pInt
  }
  void Method2()
  {
   //call method of m_pInt
  }
}

  我们只能访问SomeClass的公共方法,而无法直接访问接口指针,这时就不能使用使用全局接口表的方法。如果需要在不同线程中调用SomeClass的方法,唯一的办法就是把所有的调用放在一个线程中。怎么做到这一点呢?用一个消息窗口来同步是一个简单的方法。

  首先定义一个窗口类,把所有对SomeClass的操作定义成窗口消息,如下:

#define WM_METHOD1 WM_USER + 100
#define WM_METHOD2 WM_USER + 101

class CThreadWnd : public CWindowImpl<CThreadWnd>
{
 private:
  SomeClass m_someClass;
 public:
  BEGIN_MSG_MAP(CThreadWnd)
   MESSAGE_HANDLER(WM_METHOD1, OnMethod1)
   MESSAGE_HANDLER(WM_METHOD2, OnMethod2)
  END_MSG_MAP()


  LRESULT OnMethod1(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
  LRESULT OnMethod2(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
}

  在OnMethod1和OnMethod2中完成对m_someClass的方法调用,如果方法有参数,通过wParam和lParam传递。

  然后,我们需要做的是在一个线程中创建这个窗口。并在需要调用SomeClass的方法时,通过向CThreadWnd窗口发送消息间接完成。例如:

CThreadWnd wndThread;

//In thread A
wndThread.SendMessage(WM_METHOD1);

//In thread B
wndThread.SendMessage(WM_METHOD2);

  至于wndThread,可以保存在任何地方。而创建线程窗口的线程函数代码基本上应该是这样的:

UINT WINAPI ThreadProc(LPVOID lpParam)
{
 ::CoInitialize(0);

 CThreadWnd *pWnd = (CThreadWnd*)lpParam;

 CMessageLoop theLoop;
 _Module.AddMessageLoop(&theLoop);

 pWnd->Create(NULL, CRect(0, 0, 0, 0), NULL, WS_POPUP);
 
 theLoop.Run();

 pWnd->DestroyWindow();

 _Module.RemoveMessageLoop();
 
 ::CoUninitialize();

 return 0;
}

  创建线程的代码就不贴了,销毁线程则只要向线程窗口发送WM_QUIT消息即可。这个方法在实际应用中个人感觉非常有效。

  有一个问题是当方法参数比较多时,很难通过wParam和lParam传递。这就需要另外定义一个结构,存放各种参数,然后通过wParam传递结构的地址。总之人是活的,灵活运用。
  阅读关于 VC 的全部文章

关注此文的读者还看过:

返回开发频道首页

共2页。 上一页12

软件频道最新更新

热点推荐

IT嘉年华

编辑推荐

软件下载

热门
推荐

网友关注

软件
资料
游戏

装机推荐

文章排行

本周
本月
最新更新
天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络