MFC 一种比较笨的办法实现多线程执行类成员函数

本文作为小弟初学多线程的笔记,如有纰漏大神轻喷。。

还是使用全局函数作为线程函数,就不用比较花里胡哨的办法比如联合体,友元函数等来将类成员函数作为线程函数使用了。

需求如下:
现有两个类
一个是界面的对话框类

class CXXDlg
{
///省略其它
    CFun m_fun;
    afx_msg void OnButtonStart();
};

一个是实现功能的类,而这个类里有一个函数fun()是需要阻塞式运行的,如下:

class CFun
{
    fun();
}

需要在界面中新开线程执行这个fun(),我是怎么做的呢,其实很简单,利用了传参数的方式,直接将类成员函数的地址传给线程处理函数:
头文件中:

class CXXDlg
{
///省略其它
    CFun m_fun;
    CWinThread* pThread;//加入线程对象的声明
    afx_msg void OnButtonStart();
};

UINT ThreadFunc(LPVOID pvParam);//加入全局线程处理函数的声明

源文件中:

CFun *pFun;//定义全局对象
CCriticalSection critical_section;//加入临界区对象进行线程同步
void CXXDlg::OnButtonStart()
{
    pFun=&m_fun;//获取原来成员对象的指针
    pThread = AfxBeginThread(ThreadFunc, pFun);//传入线程函数并开启线程
}

UINT ThreadFun(LPVOID pvParam)//实现全局线程处理函数
{
    CFun * pFunc = (CFun *)lpParam;
    critical_section.Lock();//临界区保护
    pFunc->Fun();//用参数的方式调用类成员函数
    critical_section.Unlock();//临界区退保护
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值