WTL多线程,多接口和图书馆

时间:2013-08-20 13:12:24

标签: winapi visual-c++ 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从'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。 这是为什么?我不明白! (我希望我成功地解释了自己)。

1 个答案:

答案 0 :(得分:1)

您至少从描述中看到的问题是,无论您通过CreateAnObject使用哪种外部API,它都会限制其进一步用于创建线程。按原样,您仅限于从创建线程进行调用。每当您在其他主题上运行的代码(包括托管CWarningDlg的线程)需要与此API通信时,您需要将调用转移到CActionDlg线程并从那里继续。

您可以SendMessage进行同步,或者使用事件/消息完成通知更安全PostMessage