小弟根据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
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
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没用过,不知道编译有没有问题