我有一个显示接口的主线程,在显示主界面之前从主线程创建的另一个线程中,我按顺序创建其他窗口: 我创建了第一个窗口:
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函数的线程的THREAD ID,它使用::GetCurrentThreadId();
获取它,同时创建此复杂对象GetCurrentThreadId()返回SECOND THREAD的ID,这是好的。
现在,在我的CActionDialog中,我收到来自此对象usind :: SendMessage()的通知,SendMessage函数是从一个特定于刚刚创建的复杂对象的Worker线程中调用的。
当我收到这些通知时,我需要访问一些复杂的对象值,因为我从“ComplexObject.DLL”中调用了一些其他函数,这些函数使用:: GetCurrentThreadId()函数验证调用线程的ID是否与创建该复杂对象的线程的ID。对我来说验证失败了,因为函数是使用MAIN THREAD的线程ID调用的,它具有Main接口GUI。
这是为什么?我不明白! (我希望我成功地解释了自己)。
答案 0 :(得分:1)
您至少从描述中看到的问题是,无论您通过CreateAnObject
使用哪种外部API,它都会限制其进一步用于创建线程。按原样,您仅限于从创建线程进行调用。每当您在其他主题上运行的代码(包括托管CWarningDlg
的线程)需要与此API通信时,您需要将调用转移到CActionDlg
线程并从那里继续。
您可以SendMessage
进行同步,或者使用事件/消息完成通知更安全PostMessage
。