我正在尝试在名为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");
}
}
输出:NULL
AfxGetMainWnd() - &gt; GetSafeHwnd()在主线程中工作。
谢谢!
答案 0 :(得分:4)
AfxGetApp() - &gt; GetMainWnd()在线程中工作。
无需将窗口句柄存储在ClientManager的成员中。
答案 1 :(得分:3)
如果从应用程序的主线程调用AfxGetMainWnd,它将根据上述规则返回应用程序的主窗口。如果从应用程序中的辅助线程调用该函数,则该函数返回与进行调用的线程关联的主窗口。
所以你需要从主线程进行调用。在调用AfxBeginThread
之前执行此操作,并将生成的窗口句柄存储在ClientManager
的成员中。然后,您的线程可以通过其ClientManager
引用访问窗口句柄。