首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么`agile_ref`会因为一些对象而失败,比如`CoreWindow`?

为什么`agile_ref`会因为一些对象而失败,比如`CoreWindow`?
EN

Stack Overflow用户
提问于 2018-06-02 13:11:24
回答 1查看 140关注 0票数 0

C++/WinRT的agile_ref应该允许以敏捷的方式使用非敏捷对象。然而,我发现这至少对于CoreWindow实例是失败的。

举个简短的例子:

代码语言:javascript
复制
void Run()
{
    auto window{ CoreWindow::GetForCurrentThread() };
    window.Activate();

    auto agile_wnd{ make_agile(window) };
    ThreadPool::RunAsync([=](const auto&) {
        auto other_wnd{ agile_wnd.get() };
        other_wnd.SetPointerCapture();
    });

    auto dispatcher{ window.Dispatcher() };
    dispatcher.ProcessEvents(CoreProcessEventsOption::ProcessUntilQuit);
}

在UI线程上调用Run(),然后尝试创建一个agile引用,然后使用它从线程池调用CoreWindow。然而,对于"The application called an interface that was marshaled for a different thread.",这是失败的,因为agile_ref在内部使用RoGetAgileReference来编组对象,而创建引用然后解组它的调用都成功了,在我看来,这就是CoreWindow根本拒绝被编组。

当然,除非它按预期工作,并且RoGetAgileReference调用无法编组CoreWindow

那么,是什么导致SetPointerCapture调用失败,即使使用agile_ref

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 07:24:34

这个错误具有误导性。大多数Windows.UI类实际上都是敏捷的。挑战在于它们执行显式的线程检查,以确保您实际上是从适当的UI线程调用它们。这就是为什么agile_ref帮不上忙。解决方案是使用Dispatcher,它使您处于正确的线程上。然后,您可以直接调用对象上的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50653703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档