MFC中使用boost::bind进行多线程编程的一种方法

时间:2022-09-09 07:35:39
        之前写了一个图像处理的程序,计算量比较大,进行图像计算的函数耗时大概在400ms,就想着用多线程优化一下代码,提高处理速度。在网上查了很多,偶然发现很多人在用Boost库进行多线程编程,于是我就down下来Boost库,并在VS2013中配置了这个库,具体怎么配置网上有很多教程,可以参考:“ 点击打开链接”。东西要一口一口吃,我先建立了一个控制台程序,用多线程跑了一个数字输出函数,没有问题,运行正常。我就接着建立了一个MFC工程,这个工程用来同时在10个edit文本框内显示系统时间,精度在秒,想实现毫秒精度可以参考 点击打开链接

一、具体的函数代码

1、显示时间的函数为:

void CMFC_Boost_TestDlg::Time(int a)
{
// TODO:  在此添加命令处理程序代码
CTime time = CTime::GetCurrentTime();
int nYear = time.GetYear();
int nMonth = time.GetMonth();
int nDay = time.GetDay();
int nHour = time.GetHour();
int nMin = time.GetMinute();
int nSec = time.GetSecond(); 
CString szTime;
szTime.Format("ID:%d      %d_%d_%d_%d_%d_%d",a, nYear, nMonth, nDay, nHour, nMin, nSec);
GetDlgItem(a)->SetWindowTextA(szTime);
}
        函数 CMFC_Boost_TestDlg::Time(int a)的输入变量为edit控件的编号。我在void CMFC_Boost_TestDlg::OnTimer(UINT_PTR nIDEvent)函数里生成一个计数器,这个计数器可以同时生成10个线程,每个线程都调用void CMFC_Boost_TestDlg::OnTimer(UINT_PTR nIDEvent):
void CMFC_Boost_TestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO:  在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1:
{
//this 用来捕获父窗口的地址
boost::thread thrd1(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT1));
boost::thread thrd2(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT2));
boost::thread thrd3(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT3));
boost::thread thrd4(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT4));
boost::thread thrd5(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT5));
boost::thread thrd6(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT6));
boost::thread thrd7(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT7));
boost::thread thrd8(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT8));
boost::thread thrd9(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT9));
boost::thread thrd10(boost::bind(&CMFC_Boost_TestDlg::Time, this, IDC_EDIT10));
break;
}
}
CDialogEx::OnTimer(nIDEvent);
}
        对“开始”按钮关联一个函数用来打开计数器,同时打开多线程,给“结束”按钮关联一个函数用来销毁计数器,同时销毁多线程。

二、生成执行程序前要进行的设置:

1、将运行库设置成:  多线程调试DLL(/MDd)

MFC中使用boost::bind进行多线程编程的一种方法

2、在       配置属性  ->  C/C++  ->  命令行  ->  其他选项         添加:         /D "_AFXDLL" 


        生成运行程序,运行后一切正常^_^!。

MFC中使用boost::bind进行多线程编程的一种方法

        后面我会对MFC图像处理工程移植这种处理过程,希望不会报bug。