У меня есть основной поток, который отображает интерфейс, в другом потоке, созданном из основного потока до отображения основного интерфейса, я последовательно создаю два других окна: я создаю первое окно:
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 потока, вызвавшего функцию CREATION, он получает его с помощью ::GetCurrentThreadId();
, при создании этого сложного объекта GetCurrentThreadId() возвращает идентификатор ВТОРОГО ПОТОКА, что ХОРОШО. Теперь в моем CActionDialog я получаю уведомления от этого объекта с помощью ::SendMessage(), функция SendMessage вызывается из рабочего потока, специфичного для только что созданного сложного объекта. Когда я получаю эти уведомления, мне нужно получить доступ к некоторым из этих сложных значений объектов, для этого я вызываю некоторые другие функции из "ComplexObject.DLL", которые проверяют с помощью функции ::GetCurrentThreadId(), что идентификатор вызывающего потока совпадает с идентификатор потока, который создал этот сложный объект. Эта проверка не работает для меня, потому что функции вызываются с использованием идентификатора потока MAIN THREAD, который имеет графический интерфейс основного интерфейса. Почему это? Я не понимаю! (Надеюсь, я успешно объяснил себя).