之前写了一个图像处理的程序,计算量比较大,进行图像计算的函数耗时大概在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)
2、在 配置属性 -> C/C++ -> 命令行 -> 其他选项 添加: /D "_AFXDLL"
生成运行程序,运行后一切正常^_^!。
后面我会对MFC图像处理工程移植这种处理过程,希望不会报bug。