子线程中调用主线程的窗口指针

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

posted @ 2012-11-02 11:35  拿枪的程序员  阅读(1829)  评论(0编辑  收藏  举报