2011-09-26 54 views
3

我試圖創建一個名爲ClientManager類工作線程,但我不能得到新的CWinThread訪問AfxGetMainWnd(),即:如何從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 () - > GetSafeHwnd()在主線程中工作。

謝謝!

回答

3

documentation說:

如果AfxGetMainWnd從應用程序的主線程中調用,它根據上述規則返回應用程序的主窗口。如果該函數是從應用程序中的輔助線程調用的,則該函數返回與進行調用的線程關聯的主窗口。

所以你需要從主線程中調用。在您致電AfxBeginThread之前執行此操作,並將結果窗口句柄存儲在ClientManager的成員中。然後,您的線程可以通過ClientManager參考訪問窗口句柄。

3

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

無需將窗口句柄存儲在ClientManager的成員中。

+0

這似乎爲我們工作。使用此解決方案有什麼隱患?爲什麼這不是被接受的答案? –

+0

OP在2011年問了這個問題。現在是2016年。它的工作原理很簡單,因爲m_pMainWnd是在InitInstance()中設置的,並且通常一直存在,直到應用程序窗口被銷燬。 –

+0

我正在使用您的解決方案,但我想知道您的解決方案是否有任何看不見的問題 –