2013-08-20 50 views
0

我有一個主線程顯示一個接口,在顯示主接口之前從主線程創建的另一個線程內,我創建了其他兩個窗口: 我創建了第一個窗口: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。 這是爲什麼?我不明白! (我希望我成功地解釋了我自己)。

回答

1

從你的描述看,你似乎至少有一個問題,就是無論你使用的外部API通過CreateAnObject,它都會限制它進一步用於創建線程。按照原樣,您僅限於從創建線程進行調用。無論何時在其他線上運行的代碼(包括線程託管CWarningDlg)需要與此API交談,您都需要將呼叫轉移到線程CActionDlg並從此處繼續。

同步可以是SendMessage你已經做了,或者像PostMessage那樣安全的事件/消息完成通知。

+0

但是CActionDialog在第二個線程中運行還不夠嗎?它是CreateAnObject函數的本地,從創建該外部對象的位置開始。不運行該循環並在該線程中實例化CActionDialog意味着我從該線程運行? – AlexandruC

+0

'SendMessage'通過魔法「傳遞」調用到創建窗口的線程。事件如果你直接使用指針,那將是另一個線程。我想這是迷惑你的部分。一旦切換到另一個線程,你沒有切換回來,然後打線程不匹配。 –

+0

不是從複雜對象創建線程中的_Loop.Run()中調用的DispatchMessage? – AlexandruC