现在的位置: 首页 > 综合 > 正文

双线程操作

2013年09月11日 ⁄ 综合 ⁄ 共 1836字 ⁄ 字号 评论关闭

建立一个对话框,添加一个进度条控件和两个按钮控件。将两个按钮名字分别改为“启动线程1”,“启动线程2”,ID分别改为IDC_THREAD1和IDC_THREAD2。

然后为对话框插入一个MENU资源并编辑,ID为IDR_MENU1.并在对话框属性中的菜单(M)项中将IDR_MENU1选中,即将菜单添加到对黄框中。再插入一个位图资源并编辑,ID号为IDI_HEART,用于线程1,平行移动。

在头文件中定义四个protected变量 

BOOL m_bSuspend1;  //判断线程1是否启动
 BOOL m_bSuspend2;  //判断线程2是否启动
 CWinThread* m_pThread1;
 CWinThread* m_pThread2;

 

定义两个线程函数代码如下

UINT WorkThread1(LPVOID param)  //线程1动作处理函数,自定义,不需要声明
{
 CTwoThreadDlg* pMainWnd=(CTwoThreadDlg*)AfxGetMainWnd();  //得到主对话框窗口对象的指针
 CButton* pButton=(CButton*)pMainWnd->GetDlgItem(IDC_THREAD1); //获取指定标识符的控件对象的指针
 pButton->EnableWindow(FALSE);  //禁止掉按钮
 CWnd *pIcon=pMainWnd->GetDlgItem(IDI_ICON1);
 CRect iconrect;
  pIcon->GetWindowRect(&iconrect);
 pMainWnd->ScreenToClient(&iconrect);  //桌面串口坐标和对话框窗口坐标的转化
 int x=iconrect.left;
 int y=iconrect.top;
 
 CRect rect;
 pMainWnd->GetClientRect(&rect);
 while(x<rect.right-iconrect.Width() && !bExit1)
 {
  pIcon->SetWindowPos(NULL,x,y,0,0,SWP_NOSIZE | SWP_NOZORDER);
  x+=2;
  Sleep(100);   //休眠100ms
 }
 pButton->EnableWindow(TRUE); //恢复按钮
 bExit1=FALSE;
 return(0);
}

UINT WorkThread2(LPVOID param)  //线程2动作处理函数,自定义
{
 CTwoThreadDlg* pMainWnd=(CTwoThreadDlg*)AfxGetMainWnd();
 CButton *pButton=(CButton*)pMainWnd->GetDlgItem(IDC_THREAD2);
 pButton->EnableWindow(FALSE);
 CProgressCtrl* pProgress=(CProgressCtrl*)pMainWnd->GetDlgItem(IDC_PROGRESS1);
 pProgress->SetRange(0,500);
 pProgress->SetPos(0);
 int nPos=pProgress->GetPos();
 while(nPos<500 && !bExit2)
 {
  pProgress->OffsetPos(5);
  nPos=pProgress->GetPos();
  Sleep(100);
 }
 pButton->EnableWindow(TRUE);
 bExit2=FALSE;
 return 0;
}

 

对两个按钮添加消息响应并编辑代码:

void CTwoThreadDlg::OnThread1()   //启动线程1按键消息处理
{
 // TODO: Add your control notification handler code here
 m_pThread1=AfxBeginThread(WorkThread1,0);  //开始线程1的全局函数
}

void CTwoThreadDlg::OnThread2()   //启动线程2按键消息处理
{
 // TODO: Add your control notification handler code here
  m_pThread2=AfxBeginThread(WorkThread2,0);  //开始线程1的全局函数
}

抱歉!评论已关闭.