請問在ActiveX控件中,定義了一個線程,向控件發送消息,控件接收到消息觸發事件,就象MSComm的OnComm事件

developCpp 2005-11-15 10:07:24
請問在ActiveX控件中,定義了一個線程,向控件發送消息,控件接收到消息觸發事件
就象MSComm的OnComm事件
我這樣寫的:

//定義消息
#define WM_UPDATEDATA WM_USER+1000

//定義一個結構體,用來跟線程傳送數據
struct ThreadData
{
HWND hwnd;
int iValue;
BOOL bTerminateThread;

ThreadData() // 設定預設值
{
bTerminateThread=FALSE;
}
}* m_pData;

//線程函數如下
UINT WorkThreadProc(LPVOID lParam)
{
ThreadData *pData=(ThreadData*)lParam;
if(pData==NULL)return -1;

int i=0;
while(!pData->bTerminateThread)
{
Sleep(1000);
i++;
pData->iValue=i;

//************問題可能在這個***************************
::SendMessage(pData->hwnd,WM_UPDATEDATA,0,0);
//*************************************************8
}
return 0;
}

//控件響應消息
BEGIN_MESSAGE_MAP(CSampleCtrl, COleControl)
ON_MESSAGE(WM_UPDATEDATA, HandMsg)
END_MESSAGE_MAP()

//消息處理函數
UINT CSampleCtrl::HandMsg(WPARAM,LPARAM)
{
MessageBox("ok");
FireOnRun(m_pData->iValue);//觸發事件
return 1;
}

//控件有兩個方法:打開,關閉
//打開
void CSampleCtrl::StartRun()
{
// TODO: Add your dispatch handler code here
m_pData=new ThreadData;

//*****問題可能在這裡**************
m_pData->hwnd=this->m_hWnd;
//****************************

AfxBeginThread(WorkThreadProc,(LPVOID)m_pData);
}

//關閉
void CSampleCtrl::StopRun()
{
// TODO: Add your dispatch handler code here
m_pData->bTerminateThread=TRUE;
}

問題是消息處理函數沒動作
各位大俠幫幫看看喔
不勝感激!!
...全文
227 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
developCpp 2005-11-17
  • 打赏
  • 举报
回复
搞定了
謝謝兩位大俠的幫助
只要把FireOnRun定義為public
就可以在Thread里使用了
developCpp 2005-11-17
  • 打赏
  • 举报
回复
谢谢了
刚才没有看到
我现在试一下看看
developCpp 2005-11-17
  • 打赏
  • 举报
回复
回贴次数大于给分次数是甚么意义呢? 论坛给不了分了哦!!!
zxyjyzxyjy 2005-11-17
  • 打赏
  • 举报
回复
不用窗口,在你建线程时,把this传过去,在收到数据时,直接this->FireOnRun函数看看。
developCpp 2005-11-17
  • 打赏
  • 举报
回复
哈哈
搞定了
怎麼給分呢??
sunj_study 2005-11-17
  • 打赏
  • 举报
回复
mark
developCpp 2005-11-17
  • 打赏
  • 举报
回复
谢谢了
刚才没有看到
我现在试一下看看
developCpp 2005-11-17
  • 打赏
  • 举报
回复
问题终于找到了
可是不用多线程怎么不停的监视USB口有没有数据呢
难道用OnTimer???
发现在COleContrl类里也没有SetTimer()和KillTimer()
真的晕了,这么奇怪的类,从CWnd继承的却没有这些基本的成员函数了
不胜感激!
shaoqiang 2005-11-17
  • 打赏
  • 举报
回复
如果控件设置运行时不显示,this->m_hWnd就是NULL,如果要使用控件句柄,去除运行时不显示设置。
/////////////////////////////////////////////////////////////////////////////
// Control type information

static const DWORD BASED_CODE _dwAUTOCTSOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;
developCpp 2005-11-17
  • 打赏
  • 举报
回复
错了,this->m_hWnd就是NULL
就是说,控件类COleContrl没有m_hWnd,
在写的时候我 this-> 之后列表就没有m_hWnd项,我是硬写上去的
可是编译没有错误呀, this->m_hWnd值就是NULL
可是应该怎么传消息到主线程来触发FireOnComm事件呢?
不胜感激!
developCpp 2005-11-17
  • 打赏
  • 举报
回复
"....调试一下你的控件,看看m_pData->hwnd=this->m_hWnd时是不是一个NULL值啊..."

在m_pData->hwnd=this->m_hWnd时不是一个NULL值
但是在::SendMessage(pData->hwnd,WM_UPDATEDATA,0,0);时候pData->hwnd是NULL

就是说m_hWnd值没有传到线程里面,怎么会这样呢?
developCpp 2005-11-16
  • 打赏
  • 举报
回复
晕我就是这么写的
但是FireOnComm只能在主线程里用哦
我读数据的部分是在另一个线程里的
当读到数据就发个消息通知主线程
这个问题就在发消息上,
我用窗口类(从CWnd继承)的时候是可以的
但是用控件类(从COleContrl继承)的时候就没有反应了,
真是奇怪,COleContrl也是从CWnd继承的呀,怎么会不行呢??
不胜感激!
fine10000 2005-11-16
  • 打赏
  • 举报
回复
学习ing
up
zxyjyzxyjy 2005-11-16
  • 打赏
  • 举报
回复
不好意思,刚看了一下,不能在另一个线程直接调用FireOnComm.
调试一下你的控件,看看m_pData->hwnd=this->m_hWnd时是不是一个NULL值啊。不会是无窗口的控件吧??
zxyjyzxyjy 2005-11-16
  • 打赏
  • 举报
回复
如果在控件内部使用一个线程来读数据,一旦有数据到来,直接调用FireOnComm行不行???
zxyjyzxyjy 2005-11-16
  • 打赏
  • 举报
回复
上面说的是在客户端使用控件的注意事项。
zxyjyzxyjy 2005-11-16
  • 打赏
  • 举报
回复
但是FireOnComm只能在主线程里用哦
我读数据的部分是在另一个线程里的

用MFC写ActiveX控件,生成的是ocx文件,它的ThreadingModel是Apartment,因此这个com对象只能在单线程中使用,如果多线程使用只能为每个线程创建一个单独的实列。

因此在另一个线程中肯定不能使用在主线程中创建的那个com对象的实列,如果实在要用,那得对com对象的接口进行调度,使用CoMarshalInterThreadInterfaceInStream函数把接口放入流中,并在另一个要使用的线程中使用CoGetInterfaceAndReleaseStream来获得接口并对其使用,同是还得在你的那个线程中调用CoInitialize来为其建立一个单线程住所(你的主线程肯定是调用了这个函数的,不然com建不成功。)。
developCpp 2005-11-15
  • 打赏
  • 举报
回复
请问在ActiveX控件中,定义了一个线程,向控件发送消息,控件接收到消息触发事件
就象MSComm的OnComm事件
我这样写的:

//定义消息
#define WM_UPDATEDATA WM_USER+1000

//定义一个结构体,用来跟线程传送数据
struct ThreadData
{
HWND hwnd;
int iValue;
BOOL bTerminateThread;

ThreadData() // 设定默认值
{
bTerminateThread=FALSE;
}
}* m_pData;

//线程函数如下
UINT WorkThreadProc(LPVOID lParam)
{
ThreadData *pData=(ThreadData*)lParam;
if(pData==NULL)return -1;

int i=0;
while(!pData->bTerminateThread)
{
Sleep(1000);
i++;
pData->iValue=i;

//************问题可能在这个***************************
::SendMessage(pData->hwnd,WM_UPDATEDATA,0,0);
//*************************************************8
}
return 0;
}

//控件响应消息
BEGIN_MESSAGE_MAP(CSampleCtrl, COleControl)
ON_MESSAGE(WM_UPDATEDATA, HandMsg)
END_MESSAGE_MAP()

//消息处理函数
UINT CSampleCtrl::HandMsg(WPARAM,LPARAM)
{
MessageBox("ok");
FireOnRun(m_pData->iValue);//触发事件
return 1;
}

//控件有两个方法:打开,关闭
//打开
void CSampleCtrl::StartRun()
{
// TODO: Add your dispatch handler code here
m_pData=new ThreadData;

//*****问题可能在这里**************
m_pData->hwnd=this->m_hWnd;
//****************************

AfxBeginThread(WorkThreadProc,(LPVOID)m_pData);
}

//关闭
void CSampleCtrl::StopRun()
{
// TODO: Add your dispatch handler code here
m_pData->bTerminateThread=TRUE;
}

问题是消息处理函数没动作
各位大侠帮帮看看喔
不胜感激!!
zxyjyzxyjy 2005-11-15
  • 打赏
  • 举报
回复
如果你用MFC ActiveX ControlWizard写一个控件,则在你的ClassView里有一个与应用类(如应用类为CMyCtrolApp)相似名字的东西(_DMyCtrolEvents),在这个东西上弹了菜单再选Add Event....,则可增加一个事件函数(外部名为OnComm,则内部名为FireOnComm),注意在控件内并没有任何实现,只要需要时如有数据来了调用FireOnComm函数就成。具体可在MSDN中搜标题“Adding an Event to an MFC ActiveX Control”可查看帮助。
developCpp 2005-11-15
  • 打赏
  • 举报
回复
在下刚刚接触到ActiveX控件开发,还是用的MFC开发套路
在写一个读写USB口的ActiveX控件,提供给VB使用的
有没有简单的例子可以参考一下呢?
最好是像MSComm这样的例子
不胜感激!
加载更多回复(2)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧