我有一个显示界面的主线程,在显示主界面之前从主线程创建的另一个线程中,我按顺序创建了两个其他窗口:我创建了第一个窗口:
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”调用一些函数,这些函数创建一个复杂对象,该对象保存调用 CREATION 函数的线程的线程 ID,它通过::GetCurrentThreadId();
,在创建这个复杂对象时,GetCurrentThreadId() 返回第二个线程的 ID,这很好。现在,在我的 CActionDialog 中,我使用 ind ::SendMessage() 接收来自该对象的通知,SendMessage 函数是从特定于刚刚创建的复杂对象的工作线程内调用的。当我收到这些通知时,我需要访问一些复杂的对象值,为此我从“ComplexObject.DLL”调用其他一些函数,这些函数使用 ::GetCurrentThreadId() 函数验证调用线程的 ID 是否与创建该复杂对象的线程的 ID。该验证对我来说失败了,因为使用具有主界面 GUI 的主线程的线程 ID 调用了这些函数。这是为什么?我无法理解!(我希望我成功地解释了自己)。