2013-08-20 23 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