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();//临界区退保护
}

猜你喜欢

转载自blog.csdn.net/sssaaaannnddd/article/details/79025509