子线程中调用主线程的窗口指针
最近在研究VC多线程编程的问题,碰到了在子线程中调用主线程的窗口指针,使用了HWND* afxGetMainWnd(),如下面的线程函数:
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); } }
程序编译能够通过,当你运行到::SetDlgItemText()函数时,你会遇到访问地址冲突的问题。这是因为,在子线程里获取的主窗口指针,并非真正的窗口指针,所以不能对其操作。
解决这个问题,你需要添加一个CWnd* m_pCWnd的全局变量,然后在主对话框的OnInitDialog()里面添加m_pCWnd = AfxGetMainWnd();最后修改上面出错的部分:
::SetDlgItemText(m_pCWnd->m_hWnd, IDC_TIME, strTime);
运行程序,OK了。