Как получить доступ к AfxGetMainWnd () из CWinThread? - PullRequest
5 голосов
/ 26 сентября 2011

Я пытаюсь создать рабочий поток в классе с именем ClientManager, но не могу получить доступ к AfxGetMainWnd () из нового CWinThread, т.е.:

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 () работает в основном потоке.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 21 июля 2016

AfxGetApp () -> GetMainWnd () работает в потоках.

Нет необходимости хранить дескриптор окна в элементе ClientManager.

3 голосов
/ 26 сентября 2011

Документация гласит:

Если AfxGetMainWnd вызывается из основного потока приложения, оно возвращает главное окно приложения в соответствии с вышеуказанными правилами. Если функция вызывается из вторичного потока в приложении, функция возвращает главное окно, связанное с потоком, который сделал вызов.

Так что вам нужно сделать звонок из основного потока. Сделайте это непосредственно перед вызовом AfxBeginThread и сохраните полученный дескриптор окна в элементе ClientManager. Тогда ваш поток может получить доступ к дескриптору окна через ссылку ClientManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...