小弟根据VC++多线程编程及实例进行学习操作(使用的是vs2008),TestDlg.cpp下的主要程序如下:
void ThreadFunc()
{
CTime time;
CString strTime;
m_bRun=TRUE;
while(m_bRun)
{
time=CTime::GetCurrentTime();
strTime=time.Format(_T("%H:%M:%S"));
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);
Sleep(1000);
}
}void CMultiThread1Dlg::OnBnClickedStart()
{
// TODO: 在此添加控件通知处理程序代码
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
NULL,
0,
&ThreadID);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
}void CMultiThread1Dlg::OnBnClickedStop()
{
// TODO: 在此添加控件通知处理程序代码
m_bRun=FALSE;
GetDlgItem(IDC_START)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}
编译没问题,当调试运行到
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);
时就出现错误;
错误提示为:
     MultiThread1.exe 中的 0x00413847 处未处理的异常: 0xC0000005: 读取位置 0x00000020 时发生访问冲突
不知道如何解决?求教?orz

解决方案 »

  1.   

    新建的线程不能用AfxGetMainWnd吧,在CreateThread之前先AfxGetMainWnd然后把句柄当作参数传给ThreadFunc试试.
      

  2.   


    BOOL m_bRun;
    CWinThread *hThread=NULL;
    UINT ThreadFunc(LPVOID lParam)
    {
    CTime time;
    CString strTime;
    m_bRun=TRUE;
    while(m_bRun)
    {
    time=CTime::GetCurrentTime();
    strTime=time.Format(_T("%H:%M:%S"));
    ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);
    Sleep(1000);
    }
    return 0;
    }void CMyTextProgramDlg::OnStart() 
    {
    hThread=AfxBeginThread(ThreadFunc,NULL); GetDlgItem(IDC_START)->EnableWindow(FALSE);
    GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
    }void CMyTextProgramDlg::OnStop() 
    {
    m_bRun=FALSE;
    GetDlgItem(IDC_START)->EnableWindow(TRUE);
    GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
    }贴一个我的代码,供参考,我收在6.0下编译的2008没用过,不知道编译有没有问题
      

  3.   

    没错,工作线程不要使用AfxGetMainWnd()来获取窗口句柄,应该使用全局变量保存之,然后给主线程发消息:lResult = SendMessage(      // returns LRESULT in lResult     (HWND) hWndControl,      // handle to destination control     (UINT) WM_SETTEXT,      // message ID     (WPARAM) wParam,      // = (WPARAM) () wParam;    (LPARAM) lParam      // = (LPARAM) () lParam; );  
      

  4.   

    AfxGetApp()-> m_pMainWnd-> m_hWnd