子线程中如何调用对话框的变量和函数

来源:互联网 发布:软件开发工作怎么样 编辑:程序博客网 时间: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);

这样的话就可以了,解决了线程函数中不能使用成员变量的问

0 0
原创粉丝点击