【发布时间】:2013-08-22 13:27:13
【问题描述】:
我有一个显示界面的主线程,在显示主界面之前从主线程创建的另一个线程中,我按顺序创建了两个其他窗口: 我创建了第一个窗口:
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 () 返回 SECOND THREAD 的 ID,这是 GOOD。
现在,在我的 CActionDialog 中,我使用 ind ::SendMessage() 接收来自该对象的通知,SendMessage 函数是从特定于刚刚创建的复杂对象的工作线程内调用的。
当我收到这些通知时,我需要访问一些复杂的对象值,为此我从“ComplexObject.DLL”调用其他一些函数,这些函数使用 ::GetCurrentThreadId() 函数验证调用线程的 ID 是否与创建该复杂对象的线程的 ID。该验证对我来说失败了,因为使用具有主界面 GUI 的主线程的线程 ID 调用了这些函数。
这是为什么?我不明白! (我希望我成功地解释了自己)。
【问题讨论】:
标签: winapi visual-c++ wtl