0

我有一个显示界面的主线程,在显示主界面之前从主线程创建的另一个线程中,我按顺序创建了两个其他窗口:我创建了第一个窗口:

    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 函数的线程的线程 ID,它通过::GetCurrentThreadId();,在创建这个复杂对象时,GetCurrentThreadId() 返回第二个线程的 ID,这很好。现在,在我的 CActionDialog 中,我使用 ind ::SendMessage() 接收来自该对象的通知,SendMessage 函数是从特定于刚刚创建的复杂对象的工作线程内调用的。当我收到这些通知时,我需要访问一些复杂的对象值,为此我从“ComplexObject.DLL”调用其他一些函数,这些函数使用 ::GetCurrentThreadId() 函数验证调用线程的 ID 是否与创建该复杂对象的线程的 ID。该验证对我来说失败了,因为使用具有主界面 GUI 的主线程的线程 ID 调用了这些函数。这是为什么?我无法理解!(我希望我成功地解释了自己)。

4

1 回答 1

1

至少从您的描述来看,您似乎遇到的问题是,无论您使用 via 的任何外部 API CreateAnObject,它都将其进一步用于创建线程。照原样处理,您只能从创建线程进行调用。每当您在其他线程(包括线程托管CWarningDlg)上运行的代码需要与此 API 通信时,您需要将调用转移到CActionDlg线程并从那里继续。

同步可以是SendMessage你已经做的,或者更安全的,比如PostMessage事件/消息完成通知。

于 2013-08-20T13:37:50.330 回答