参考网上的例子,是在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条评论)
登录后参与讨论