二.如何使用多线程 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) //负责子线程向主线程报告是否中断
(待续...)

|