二.如何使用多线程
1.demo界面设置:
为了能很好的模拟测试多线程绘图显示程序,我们建立了一个简单的demo程序,
先使用mfc向导,建立一个对话框程序,并增加全局变量CDib m_dib,对话框上建立三
个按钮和一个进度条,按钮1的功能为将c:\test1.bmp读入m_dib,按钮2的功能为将
c:\test2.bmp读入m_dib,按钮3的功能为终止m_dib的读入(关于CDib将在以后详细
说明),进度条用于显示当前读入数据的进度,于是按钮中的代码如下:
void CDemoDlg::OnButton1()
{
m_dib.LoadBmp ("c:\\test1.bmp");
}
void CDemoDlg::OnButton2()
{
m_dib.LoadBmp ("c:\\test2.bmp");
}
void CDemoDlg::OnButton3()
{
m_dib.DoStop(); //停止CDib的读入操作
}
但是,m_dib读入功能为多线程读取函数那有可能在读取test1.bmp时,程序要求读取test2.bmp,
所以按钮中的代码修改如下:
void CDemoDlg::OnButton1()
{
m_dib.DoStop(); //这也可以直接加入LoadBmp中
m_dib.LoadBmp ("c:\\test1.bmp");
}
void CDemoDlg::OnButton2()
{
m_dib.DoStop();
m_dib.LoadBmp("c:\\test2.bmp");
}
当然我们还要显示m_Dib,为了显示m_Dib我们对OnPaint作如下修改:
void CDemoDlg::OnPaint()
{
CPaintDC dc(this);
CRect clientRc;
GetClientRect(&clientRc); //取得窗体大小
CDC memDC1; //我们将读入的图像置于memDC1中
CDC memDC2; //memDC2设置背景图像
CBitmap m_bitmap;
CBitmap * m_pOldBitmap;
CBitmap * m_pOldBitmapA;
memDC1.CreateCompatibleDC(&dc);
memDC2.CreateCompatibleDC(&dc);
m_bitmap.CreateCompatibleBitmap(&dc,clientRc.Width() , clientRc.Height());
m_pOldBitmapA = memDC2.SelectObject(&m_bitmap);
m_pOldBitmap = memDC1.SelectObject(&m_Dib); //m_Dib为全局变量
memDC2.BitBlt(0,0, clientRc.Width(), clientRc.Height(),
&memDC1,0,0, SRCCOPY); //将读入的图像复制到背景图中
dc.BitBlt(0,0, clientRc.Width(), clientRc.Height(),
&memDC2,0,0, SRCCOPY); //显示当前图像
memDC2.SelectObject(m_pOldBitmapA );
memDC1.SelectObject(m_pOldBitmap );
}
我们建立两个消息函数负责子线程向界面线程报告完成情况和状态,
ON_MESSAGE(WM_SETPOS, ON_WM_SETPOS) //负责子线程向主线程报告完成进度
ON_MESSAGE(WM_INTERRUPT, ON_WM_INTERRUPT) //负责子线程向主线程报告是否中断
(待续...)