我有一个主线程显示一个接口,在显示主接口之前从主线程创建的另一个线程内,我创建了其他两个窗口: 我创建了第一个窗口: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从创建一个复杂的对象,认为所谓的创作乐趣的线程的线程ID的“ComplexObject.DLL”调用一些功能它通过::GetCurrentThreadId();
得到它,同时创建这个复杂的对象GetCurrentThreadId()返回第二个线程的ID,这是很好的。 现在,在我的CActionDialog中,我从该对象usind :: SendMessage()接收通知,SendMessage函数在特定于刚刚创建的复杂对象的工作线程中调用。 当我收到这些通知时,我需要访问一些复杂的对象值,因为我从'ComplexObject.DLL'中调用了一些其他函数,它们使用:: GetCurrentThreadId()函数验证调用线程的ID是否相同作为创建该复杂对象的线程的ID。验证失败了,因为这些函数使用MAIN THREAD的线程ID进行调用,它具有主界面GUI。 这是为什么?我不明白! (我希望我成功地解释了我自己)。
但是CActionDialog在第二个线程中运行还不够吗?它是CreateAnObject函数的本地,从创建该外部对象的位置开始。不运行该循环并在该线程中实例化CActionDialog意味着我从该线程运行? – AlexandruC
'SendMessage'通过魔法“传递”调用到创建窗口的线程。事件如果你直接使用指针,那将是另一个线程。我想这是迷惑你的部分。一旦切换到另一个线程,你没有切换回来,然后打线程不匹配。 –
不是从复杂对象创建线程中的_Loop.Run()中调用的DispatchMessage? – AlexandruC