Multithreading WTL, várias interfaces e bibliotecas
Eu tenho um segmento principal que exibe uma interface, dentro de outro segmento criado a partir do thread principal antes da interface principal é mostrada, cria várias outras janelas seqüencialmente: Eu crio a primeira janela:
CWarningDlg warnDlg;
warnDlg.Create(NULL);
warnDlg.ShowWindow(SW_SHOW);
warnDlg.BringWindowToTop();
CMessageLoop _Loop ;
if(_MyAppModule.AddMessageLoop(&_Loop))
{
nRet = _Loop.Run();
_MyAppModule.RemoveMessageLoop();
}
warnDlg.DestroyWindow();
if (nRet == SOME_VALUE)
{
doSomethingElse();
}
Faça outra coisa:
CActionDlg actDlg;
actDlg.Create(NULL);
actDlg.ShowWindow(SW_SHOW);
actDlg.BringWindowToTop();
CMessageLoop _Loop ;
if(_MyAppModule.AddMessageLoop(&_Loop))
{
CreateAnObject(); //this also launches an object Specific Worker Thread
nRet = _Loop.Run();
_MyAppModule.RemoveMessageLoop();
}
A função CreateAnObject chama algumas funções de um 'ComplexObject.DLL' que cria um objeto complexo que contém o ID de THREAD do segmento que chamou a função de criação, ele obtém com::GetCurrentThreadId();
, ao criar este objeto complexo, o GetCurrentThreadId () retorna o ID do SEGUNDO THREAD, que é GOOD. Agora, no meu CActionDialog recebo notificações desse objeto usind :: SendMessage (), a função SendMessage é chamada de dentro de um thread de trabalho é específico para o objeto complexo recém criado. Quando eu recebo essas notificações eu preciso acessar alguns dos valores desse objeto complexo, para que eu chame algumas outras funções de 'ComplexObject.DLL' que verificar usando a função :: GetCurrentThreadId () que o ID do segmento de chamada é o mesmo que o ID do encadeamento que criou esse objeto complexo. Essa verificação falha para mim, porque as funções são chamadas usando o ID de encadeamento do MAIN THREAD, que possui a GUI da interface principal. Por que é que? Eu não entendo! (Espero ter me explicado com sucesso).