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

原文出处: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);

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,全局变量线程中可以通过共享内存的方式进行访问。具体方法如下: 1. 在线程内部使用`global`关键字声明全局变量,以便在函数内部更新全局变量的值。 2. 在主线程中创建全局变量,并在线程中通过引用该全局变量进行读取或修改。 例如,在上述代码中,我们可以通过以下方法在线程中访问全局变量: 1. 在线程类中创建一个全局变量。 ```python import threading class MyThread(threading.Thread): global_var = 0 def __init__(self, target=None, args=()): super(MyThread, self).__init__() self.func = target self.args = args def run(self): # 在线程中访问全局变量 global global_var global_var = self.func(*self.args) def get_result(self): try: return global_var except Exception: return None ``` 2. 在主线程中创建一个全局变量,并在线程中通过引用该全局变量进行读取或修改。 ```python from threading import Thread import time global_var = None def fun(): global global_var global_var = "123" time.sleep(5) return global_var if __name__ == "__main__": T = MyThread(target=fun) T.start() T.join() print(T.get_result()) print(global_var) print("结束") ``` 在这个例中,通过将全局变量定义在线程类中或主线程中,我们可以在线程中使用`global`关键字声明并访问该全局变量。然后在主线程中,我们可以通过线程对象的方法`get_result()`获取线程中更新后的全局变量的值,或者直接访问全局变量`global_var`来获取最终的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值