我有一個主線程顯示一個接口,在顯示主接口之前從主線程創建的另一個線程內,我創建了其他兩個窗口: 我創建了第一個窗口: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