热度 17
2016-4-25 17:19
1415 次阅读|
0 个评论
参考网上的例子,是在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); } 程序正常运行!