WEB开发网
开发学院软件开发VC 多线程编程之一——问题提出 阅读

多线程编程之一——问题提出

 2007-03-17 22:00:03 来源:WEB开发网   
核心提示: 在MultiThread3Dlg.h文件中添加一个结构的定义:struct threadInfo{UINT nMilliSecond;CProgressCtrl* pctrlProgress;};线程函数的声明:UINT ThreadFunc(LPVOID lpParam);注意,二者应在

在MultiThread3Dlg.h文件中添加一个结构的定义:struct threadInfo
{
  UINT nMilliSecond;
  CProgressCtrl* pctrlProgress;
};
线程函数的声明:UINT ThreadFunc(LPVOID lpParam);注意,二者应在类CMultiThread3Dlg的外部。

在类CMultiThread3Dlg内部添加protected型变量:HANDLE hThread;
DWORD ThreadID;
分别代表线程的句柄和ID。

在MultiThread3Dlg.cpp文件中进行如下操作:

定义公共变量 threadInfo Info;

双击按钮IDC_START,添加相应消息处理函数:void CMultiThread3Dlg::OnStart()
{
  // TODO: Add your control notification handler code here
  UpdateData(TRUE);
  Info.nMilliSecond=m_nMilliSecond;
  Info.pctrlProgress=&m_ctrlProgress;
  hThread=CreateThread(NULL,
    0,
    (LPTHREAD_START_ROUTINE)ThreadFunc,
    &Info,
    0,
    &ThreadID);
/*
  GetDlgItem(IDC_START)->EnableWindow(FALSE);
  WaitForSingleObject(hThread,INFINITE);
  GetDlgItem(IDC_START)->EnableWindow(TRUE);
*/
}
在函数BOOL CMultiThread3Dlg::OnInitDialog()中添加语句:{
  ……
  
  // TODO: Add extra initialization here
  m_ctrlProgress.SetRange(0,99);
  m_nMilliSecond=10;
  UpdateData(FALSE);
  return TRUE; // return TRUE unless you set the focus to a control
}
添加线程处理函数:UINT ThreadFunc(LPVOID lpParam){
  threadInfo* pInfo=(threadInfo*)lpParam;
  for(int i=0;i<100;i++)
  {
    int nTemp=pInfo->nMilliSecond;
    pInfo->pctrlProgress->SetPos(i);
    Sleep(nTemp);
  }
  return 0;
}
  顺便补充一点,如果你在void CMultiThread3Dlg::OnStart() 函数中添加/* */语句,编译运行你就会发现进度条不进行刷新,主线程也停止了反应。什么原因呢?这是因为WaitForSingleObject函数等待子线程(ThreadFunc)结束时,导致了线程死锁。因为WaitForSingleObject函数会将主线程挂起(任何消息都得不到处理),而子线程ThreadFunc正在设置进度条,一直在等待主线程将刷新消息处理完毕返回才会检测通知事件。这样两个线程都在互相等待,死锁发生了,编程时应注意避免。

上一页  2 3 4 5 6 7 8  下一页

Tags:线程 编程 之一

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接