最近在研究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了。

相关文章:

  • 2021-06-20
  • 2021-07-06
  • 2022-01-21
  • 2021-09-16
  • 2022-12-23
  • 2021-04-10
猜你喜欢
  • 2022-12-23
  • 2021-10-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-22
相关资源
相似解决方案