如何从CWinThread访问AfxGetMainWnd()?

nbr*_*oby 5 c++ mfc visual-studio-2010

我正在尝试在名为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");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:NULL

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

谢谢!

Tom*_*Tom 5

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

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


Dav*_*nan 3

文档

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

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