类成员函数创建线程和MFC多线程UI更新问题

本文介绍了在MFC程序中遇到的类成员函数作为线程函数创建线程时的错误,以及解决方法。讨论了线程间更新MFC UI的限制和解决方案,强调了不能跨线程调用MFC对象的原因,涉及到线程本地存储(TLS)的角色。同时,澄清了获取主窗口对象指针的一些常见误解。
摘要由CSDN通过智能技术生成


//创建线程函数CreateThread()原型
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
//其中线程函数的原型,也就是LPTHREAD_START_ROUTINE如下
DWORD WINAPI ThreadProc(\_In\_ LPVOID lpParameter);

今天在写一个MFC程序的时候,想将某个类成员函数作为线程函数创建线程,所以将该成员函数按照上面的形式进行声明和定义,编译的时候出现了“函数不接受2个参数”的错误,才意思到非静态类成员函数中的隐藏this指针。
那么解决方法如下:
1. 用外部函数作为线程函数,如果需要操作类里面的私有成员,也可以用友元函数作为线程函数。
2. 用静态成员函数作为线程函数,但这样线程岂不是只能访问静态成员变量和静态成员函数?那我们可以把对象指针作为线程函数的函数传递过去,实现对非静态成员函数和非静态成员变量的访问。

解决完“函数不接受2个参数”的问题后,成功创建了线程,对于创建的这个线程在这里就称之为“非主线程”。
在非主线程中,我有一些新数据希望在MFC的界面中更新显示,那么我就通过AfxGetApp()->GetMainWnd()依次获取当前程序的CWinApp*指

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值