C++/WinRT的agile_ref
应该允许以敏捷的方式使用非敏捷对象。然而,我发现这至少对于CoreWindow
实例是失败的。
举个简短的例子:
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
发布于 2018-06-09 07:24:34
这个错误具有误导性。大多数Windows.UI类实际上都是敏捷的。挑战在于它们执行显式的线程检查,以确保您实际上是从适当的UI线程调用它们。这就是为什么agile_ref帮不上忙。解决方案是使用Dispatcher,它使您处于正确的线程上。然后,您可以直接调用对象上的方法。
https://stackoverflow.com/questions/50653703
复制相似问题