【问题标题】:How to access AfxGetMainWnd() from CWinThread?如何从 CWinThread 访问 AfxGetMainWnd()?
【发布时间】:2011-09-26 08:15:39
【问题描述】:

我试图在一个名为 ClientManager 的类中创建一个工作线程,但我无法从新的 CWinThread 访问 AfxGetMainWnd(),即:

UINT ClientManager::WorkerThreadProc( LPVOID param ){
    ClientManager *pThis = reinterpret_cast<ClientManager*>(param);
    return pThis -> DoThreadJob();
}
UINT ClientManager::DoThreadJob(){
    createClientSession("1");
    return 0;
}

void ClientManager::createThread(){
    m_clientManagerThread = AfxBeginThread(WorkerThreadProc,this,0,0,0,NULL);           
}

void ClientManager::createClientSession(CString clientID){
    if (AfxGetMainWnd()->GetSafeHwnd()== NULL){
        _cprintf("NULL");
    }
}

输出:空

AfxGetMainWnd()->GetSafeHwnd() 在主线程中工作。

谢谢!

【问题讨论】:

    标签: c++ visual-studio-2010 mfc


    【解决方案1】:

    AfxGetApp()->GetMainWnd() 在线程中工作。

    无需将窗口句柄存储在 ClientManager 的成员中。

    【讨论】:

    • 这似乎对我们有用。使用此解决方案有什么陷阱吗?为什么这不是公认的答案?
    • OP 在 2011 年问过这个问题。现在是 2016 年。它工作起来很简单,因为 m_pMainWnd 设置在 InitInstance() 中,并且通常会一直存在到应用程序窗口被销毁为止。
    • 我正在使用您的解决方案,但我想知道您的解决方案是否存在任何未发现的问题
    • 很高兴看到您使用我的解决方案。再次没有问题,只要您不更改 m_pMainWnd。
    【解决方案2】:

    documentation 说:

    如果从应用程序的主线程调用AfxGetMainWnd,它会根据上述规则返回应用程序的主窗口。如果该函数是从应用程序中的辅助线程调用的,则该函数返回与进行调用的线程关联的主窗口。

    所以你需要从主线程进行调用。在调用AfxBeginThread 之前执行此操作,并将生成的窗口句柄存储在ClientManager 的成员中。然后您的线程可以通过其ClientManager 引用访问窗口句柄。

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 2015-10-23
      • 2011-04-01
      • 2021-12-16
      相关资源
      最近更新 更多