原创 VS2010 多线程实例1

2016-4-25 17:19 1411 17 17 分类: 软件与OS

参考网上的例子,是在VC6下运行的。

void ThreadFunc()
{
 
  CTime time;

  CString strTime;
 
  m_bRun=TRUE;

  while(m_bRun)

  {

  time=CTime::GetCurrentTime();

  strTime=time.Format("%H:%M:%S");

  ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);

  Sleep(1000);

  }
}

void CSingleThreadDlg::OnBnClickedStart()
{

  hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,

 NULL,0,&ThreadID);

  GetDlgItem(IDC_START)->EnableWindow(FALSE);

  GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
}

编译时提示:SingleThread.exe 中的 0x00413437 处有未经处理的异常: 0xC0000005: 读取位置 0x00000020 时发生访问冲突。

查询MSDN了解到,CreateThread函数,第四个参数是传递到ThreadFunc函数的参数,

所以把程序修改为:

void ThreadFunc(LPVOID p)
{
    CTime time;
    CString strTime;
    m_bRun = TRUE;
    HWND hwnd = (HWND)p;
    while (m_bRun)
    {
        time = CTime::GetCurrentTime();
        strTime = time.Format("%H:%M:%S");
        
        
        SetDlgItemText(hwnd, IDC_TIME, strTime);  //涉及进程间通信,

                                                                                     //把用户界面进程的句柄传递给工作线程
        Sleep(1000);
    }
}


void CMultiThread1Dlg::OnBnClickedStart()
{
    // TODO: 在此添加控件通知处理程序代码
    
    hThread=CreateThread(NULL,
        0,
        (LPTHREAD_START_ROUTINE)ThreadFunc,
        this->m_hWnd,               //这个参数是将要传递给ThreadFunc函数的参数,
        0,
        &ThreadID);
    this->GetDlgItem(IDC_START)->EnableWindow(FALSE);
    this->GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
    
}

程序正常运行!

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /2 下一条