| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3811 人关注过本帖
标题:一段关于线程函数中调用Sendmessage发送消息的测试程序
只看楼主 加入收藏
喜鹊王子
Rank: 1
等 级:新手上路
帖 子:105
专家分:0
注 册:2012-12-25
结帖率:89.74%
收藏
已结贴  问题点数:20 回复次数:5 
一段关于线程函数中调用Sendmessage发送消息的测试程序
在项目中碰到了线程函数中调用Sendmessage发送消息时出现断言错误的问题,特此做了一个演示程序,但不知道是什么原因。求解。

点击twopoint对话框上的Button1和Button2分别进入子对话框1和子对话框2;
点击子对话框2上的按钮会启动线程函数xthread;但是却出现了断言错误,不知道为什么?
图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册

代码如下:
// twopointsDlg.h
CCdialog1 *xxx;

// Cdialog1.h
#define UM_ALARM  WM_USER+100
afx_msg void alarm(WPARAM wParam, LPARAM lParam);

// Cdialog1.cpp
ON_MESSAGE(UM_ALARM,alarm)
void CCdialog1::alarm(WPARAM wParam, LPARAM lParam)
{
    MessageBox("BMS告警开入1");
}

// Cdialog2.cpp
UINT CCdialog2::xthread(void *param)//线程函数
{
   CCdialog2 *dlg=(CCdialog2*)param;   
   CTwopointsDlg *m_Host = (CTwopointsDlg*)AfxGetMainWnd();//获取主对话框的指针
   m_Host->xxx->SendMessage(UM_ALARM,0,0);
   return 0;
}
void CCdialog2::OnButton1()
{
    // TODO: Add your control notification handler code here
    AfxBeginThread(xthread,this);
}
搜索更多相关主题的帖子: 对话框 
2013-03-12 21:32
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6814
专家分:42393
注 册:2010-12-16
收藏
得分:0 
UINT CCdialog2::xthread(void *param)//线程函数
 {
    CCdialog2 *dlg=(CCdialog2*)param;   
    CTwopointsDlg *m_Host = (CTwopointsDlg*)AfxGetMainWnd();//获取主对话框的指针
    m_Host->xxx->SendMessage(UM_ALARM,0,0);
    return 0;
 }
你确认红色的那个获取出来的就是 CTwopointsDlg 了吗?如果不是那就一定会崩溃了的

或者把你的工程上传上来吧。我感觉你的m_Host 得到的不是一个CTwopointsDlg类型 。猜的

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-13 12:12
喜鹊王子
Rank: 1
等 级:新手上路
帖 子:105
专家分:0
注 册:2012-12-25
收藏
得分:0 
回复 2楼 yuccn
twopoints.zip (35.25 KB)

路漫漫其修远兮,吾将上下而求索。
2013-03-13 15:19
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6814
专家分:42393
注 册:2010-12-16
收藏
得分:20 
被我说对了
CTwopointsDlg *m_Host = (CTwopointsDlg*)AfxGetMainWnd();
这个你获取出来的不是你的那个CTwopointsDlg

你可以看下地址就知道他们不一样了

这样改行了:
在 twopoints.h头文件中加上这一句 :extern CTwopointsApp theApp;
之后再把CTwopointsDlg *m_Host = (CTwopointsDlg*)AfxGetMainWnd();改成
CTwopointsDlg *m_Host = (CTwopointsDlg*)theApp.m_pMainWnd; // (CTwopointsDlg*)AfxGetMainWnd();//获取主界面的指针

就行了。。
清楚了吧。AfxGetMainWnd 获取出来不一定就是你的那个CTwopointsDlg对象,如果你想确认是否是那个对象,可以这样看。在调试下,看下
twopoints.cpp 中的函数:BOOL CTwopointsApp::InitInstance()里面的m_pMainWnd = &dlg; 这个对象的地址,在看看你用AfxGetMainWnd()出来的对象的地址。你就发现他们不是同一个了


还有给楼主一个建议:这个只是测试的代码的吧,如果是实战的代码,这样设计很挫的。你可以自己来维护那个CTwopointsDlg对象的,这样你想怎么做都行了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-15 12:24
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6814
专家分:42393
注 册:2010-12-16
收藏
得分:0 
这样说,崩溃的原因你知道了吧。如果还不知道就该打了

崩溃的原因:你把一个对象进行“阉割”了。不是CTwopointsDlg的对象,你把它强行转换成CTwopointsDlg,之后用它。。好比把一个猪当成一个牛,拉去帕田~~

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-15 12:27
喜鹊王子
Rank: 1
等 级:新手上路
帖 子:105
专家分:0
注 册:2012-12-25
收藏
得分:0 
回复 4楼 yuccn
“你可以自己来维护那个CTwopointsDlg对象的,这样你想怎么做都行了”这句话我没听懂,版主能否讲具体点啊。谢谢你

路漫漫其修远兮,吾将上下而求索。
2013-03-15 20:49
快速回复:一段关于线程函数中调用Sendmessage发送消息的测试程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015649 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved