子线程中如何调用对话框的变量和函数 2011-11-29 15:05
来源:互联网 发布:生日快乐软件在线制作 编辑:程序博客网 时间:2024/06/07 06:09
因为线程函数是全局的,而对话框的成员变量属于对话框类,所以不能调用,若想使用,一方面可以将对话框指针作为参数传递给线程,另一方面可以在子线程中向主线程发送消息,然后在消息响应函数里调用想使用的对话框的函数和变量。
传递指针参数的方法:在对话框的初始化函数中调用子线程,将对话框指针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)
..............................
END_MESSAGE_MAP()
3.定义消息处理函数
LRESULT CLmsTestDlg::OnMyMessage(WPARAM wParam,LPARAM lParam)
{}
在对话框类的头文件中声明消息函数:
谢谢原作者的精彩分享。其实知道是这么个用法,却不知道要为什么用,看过之后才明白。
- 子线程中如何调用对话框的变量和函数 2011-11-29 15:05
- 子线程中如何调用对话框的变量和函数
- 主对话框如何调用子对话框的变量及事件
- MFC 子对话框调用父对话框的函数与变量
- 如何在子对话框中调用父对话框中的函数
- VC多线程中全局函数如何调用对话框类成员变量及成员函数
- 父子对话框 变量及函数的调用
- 如何在一个对话框中调用另一个对话框里的变量
- 子对话框调用主对话框函数的方法
- 如何在MFC线程中使用控件的成员变量和函数
- mfc中如何在一个对话框中调用另外一个对话框的函数
- 对话框中开辟线程,使用对话框变量的问题
- 在MFC中类内部建立线程处理函数以便调用类的成员函数和变量
- 子对话框调用父对话框函数
- 多线程函数和静态线程函数调用类成员非静态变量和函数的问题
- 子线程中创建对话框
- 子线程 run() 函数中,调用其他函数
- 子对话框调用主对话框成员变量的几种方法
- 1087Super Jumping! Jumping! Jumping(寻找和最大的升序子序列)
- 找回不小心删除掉的存储过程!
- 在COM中使用数组参数-SafeArray[转载/修改] 2011-11-29 15:02
- 设置中的Preferencescreen应用
- 在Spring中使用quartz
- 子线程中如何调用对话框的变量和函数 2011-11-29 15:05
- C#RichTextBox的 RichTextBox.Focus();rtbLog.AppendText(msg);ReadOnly
- 分配和释放 BSTR 的内存 2011-12-1 10:19
- 什么是堆、栈? fr net
- Android常用权限permission列表摘录
- 在ECLIPSE中使用maven插件创建webapp类型项目
- 总结configure,pkg-config和PKG_CONFIG_PATH
- 在虚拟机上安装mysql
- 关于SIGCHLD的几点讨论