Многопоточность WTL, несколько интерфейсов и библиотек
У меня есть основной поток, который отображает интерфейс, в другом потоке, созданном из основного потока перед отображением основного интерфейса, я последовательно создаю два других окна: создаю первое окно:
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();
}
У чего-то еще есть:
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();
}
Функция CreateAnObject вызывает некоторые функции изComplexObject.DLL» которые создают сложный объект, который содержит THREAD ID потока, который вызвал функцию CREATION, он получает его с::GetCurrentThreadId();
при создании этого сложного объекта GetCurrentThreadId () возвращает идентификатор ВТОРОЙ НИТИ, которая ХОРОША. Теперь в моем CActionDialog я получаю уведомления от этого объекта usind :: SendMessage (), функция SendMessage вызывается из рабочего потока, который является специфическим для только что созданного сложного объекта. Когда я получаю эти уведомления, мне нужно получить доступ к некоторым значениям этого сложного объекта, для этого я вызываю некоторые другие функции из 'ComplexObject.DLL» с помощью функции :: GetCurrentThreadId () убедитесь, что идентификатор вызывающего потока совпадает с идентификатором потока, создавшего этот сложный объект. Для меня эта проверка не удалась, потому что функции вызываются с использованием идентификатора потока ГЛАВНОЙ РЕЗЬБЫ с графическим интерфейсом главного интерфейса. Это почему? Не могу понять! (Надеюсь, я успешно объяснил себя).