子线程中如何调用对话框的变量和函数
来源:互联网 发布:软件开发工作怎么样 编辑:程序博客网 时间:2024/05/24 05:36
原文出处:http://hi.baidu.com/cateyefish/item/42c8cce802b5913387d9de2b
因为线程函数是全局的,而对话框的成员变量属于对话框类,所以不能调用,若想使用,一方面可以将对话框指针作为参数传递给线程,另一方面可以在子线程中向主线程发送消息,然后在消息响应函数里调用想使用的对话框的函数和变量。
传递指针参数的方法:在对话框的初始化函数中调用子线程,将对话框指针this传递给线程pOdometerQueryThread=AfxBeginThread(&OdometerQueryThreadProc,this,
THREAD_PRIORITY_NORMAL,0,0,NULL);
在子线程中,
UINT OdometerQueryThreadProc(LPVOID pParam)
{
CRobotcontrolDlg* dlg;
dlg=(CRobotcontrolDlg*)pParam;
while(m_bActive_SensorThread)
{
m_drive.drive_distance_query(&(dlg->m_comm1_Drive));
}
return 0;
}
网上好多资料说传递指针会很不安全,所谓“不安全”是因为两个线程访问同一个对象可能会有冲突,其实不只是对话框指针,凡是多个线程共用同一个东东都有这种可能,自己要知道哪些操作可能会发生冲突,并设法避免。
这个是 MFC 的一个雷区
=================================================
MfC各对象和win32 handles之间的映射关系记录在线程局部存储之中,因此,你没有办法把
一个MFC对象从某线程手上交到另一个线程手上,你也不能够在线程之间传递MFC对象指针
。。。。。。你不能够放一个指针到结构中,而该结构被一个worker线程使用。你不能够把
一个指向CDialog或CView的指针交给另一个线程。当你需要调用view或document中的一个成
员函数,特别象UpdateAllView这样的函数时,上述的限制很快会恶化。
-----摘自《win32多线程程序设计》p294
==================================================
比较安全的做法是发送消息。
可以自定义一个消息,在线程函数中利用SendMessage or PostMessage函数给主窗口发送消息,然后在窗口类的实现文件中定义消息处理函数即可,主要有以下步骤:
在对话框类的实现文件中:
1.定义消息
#define WM_MYMESSAGE WM_USER+100
2.在BEGIN_MESSAGE_MAP宏中增加一个入口将消息和函数关联起来
BEGIN_MESSAGE_MAP(CLmsTestDlg, CDialog)
//{{AFX_MSG_MAP(CLmsTestDlg)
..............................
ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3.定义消息处理函数
LRESULT CLmsTestDlg::OnMyMessage(WPARAM wParam,LPARAM lParam)
{}
在对话框类的头文件中声明消息函数:
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
这样的话就可以了,解决了线程函数中不能使用成员变量的问
- 子线程中如何调用对话框的变量和函数
- 子线程中如何调用对话框的变量和函数 2011-11-29 15:05
- 主对话框如何调用子对话框的变量及事件
- MFC 子对话框调用父对话框的函数与变量
- 如何在子对话框中调用父对话框中的函数
- VC多线程中全局函数如何调用对话框类成员变量及成员函数
- 父子对话框 变量及函数的调用
- 如何在一个对话框中调用另一个对话框里的变量
- 子对话框调用主对话框函数的方法
- 如何在MFC线程中使用控件的成员变量和函数
- mfc中如何在一个对话框中调用另外一个对话框的函数
- 对话框中开辟线程,使用对话框变量的问题
- 在MFC中类内部建立线程处理函数以便调用类的成员函数和变量
- 子对话框调用父对话框函数
- 多线程函数和静态线程函数调用类成员非静态变量和函数的问题
- 子线程中创建对话框
- 子线程 run() 函数中,调用其他函数
- 子对话框调用主对话框成员变量的几种方法
- LAMP 安装详解
- 利用cookie显示商品的浏览记录
- 行迁移和行链接详解
- 在Magento产品页使用jqZoom
- Spring MVC JSON自定义类型转换
- 子线程中如何调用对话框的变量和函数
- 新手刚用 vim 基本的操作命令
- Android学习笔记(三)Activity及Intent
- U盘中的文件无法删除导致在linux下无法挂载
- TCP/IP详解--滑动窗口与内核缓冲区之间的关系
- window对象的status、location、name、self、opener属性的使用
- C# 写日志的类文件
- VS2010中ashx文件中代码折叠实现方法(超级有用,终于找到了方法!)
- 循环链表的实现与操作(C语言实现)