在MFC编程中开始学习都是只利用一个主线程,比较蛋疼的是,当你只用一个主线程进行如播放,查询时,MFC的界面会卡死,你无法进行其他的操作,这时需要进行多线程的编程,在操作时生成一个子线程来进行一些如播放,查询等的费时的操作。
多线程,经常会与对实时性要求比较高的并行运算结合,用来隐藏数据传输过程中用到的等待时间。
基于MFC的多线程在上一篇博客的基础上进行改进:
1.简单建立如下的界面:
2给各个控制按键添加消息响应函数:
主要是对播放按钮填加函数使在点击按钮时生成一个子线程来播放图片:
zhanting=0;
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
NULL,
0,
&ThreadID);
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
GetDlgItem(IDC_CONTIUN)->EnableWindow(FALSE);
通过调用CreateThread()函数来生成一个子线程;
在Dlg.h中声明句柄:
HANDLE hThread;
DWORD ThreadID;
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
GetDlgItem(IDC_CONTIUN)->EnableWindow(FALSE);
为设置当按键被按下时其他各个框是否可被按下
下面是生成线程函数的代码:
IplImage *image=NULL; //原始图像
char filename[128];
m_bRun=true;
if(zhanting==0)
i=2;
else
{
i=weizhi;
}
for(;i<300;i++)
{
UINT ID;
ID=IDC_PICTURE;
sprintf(filename,"5//%d.jpg",i);
//if(image)
// cvReleaseImage(&image);
image = cvLoadImage(filename); //显示图片
cvWaitKey(3);
//DrawPicToHDC(image, IDC_Picture);
// CPicturesDlg.DrawPicToHDC(image, IDC_Picture);
CDuoxiancDlg* pMainWnd=(CDuoxiancDlg*)AfxGetMainWnd();
CDC *pDC = (CDC*)pMainWnd->GetDlgItem(ID)->GetDC();
HDC hDC= pDC->GetSafeHdc();
CRect rect;
pMainWnd->GetDlgItem(ID)->GetClientRect(&rect);
CvvImage cimg;
cimg.CopyOf(image);
cimg.DrawToHDC(hDC,&rect);
pMainWnd->ReleaseDC(pDC);
Sleep(30);
cvReleaseImage(&image);
if(!m_bRun)
{
weizhi=i;
break;
}
}
由于生成子线程函数不继承Dlg类,所以要用声明一个Dlg类pMainWnd
由于这里还没有与数据库连接,直接在文件夹中放图片进行读取;
线程之间的通信,这里只是简单地定义了全局变量
volatile BOOL m_bRun;
volatile int weizhi;
volatile int i;
volatile int zhanting=0;
其他两个按钮的功能通过改变全局变量来控制播放的暂停继续。
如果你是魔女,我只要化身魔王就可以了…..