0

我在 ppltasks.h 的 _ContextCallback 中有一个第一次机会例外,我只是不明白。

我的项目是一个混合 WinRT/本机应用程序。该应用程序由多个子项目组成,其中一个使用 WinRT。WinRT 代码位于与主线程不同的线程中运行的静态库中(我无权更改它)。WinRT 代码是从 Visual Studio 2012 RC 中生成的 Direct3D Metro 应用程序复制而来的。

该代码尝试加载一个简单的着色器:

void CubeRenderer::CreateDeviceResources()
{
    Direct3DBase::CreateDeviceResources();

    // going to crash while attempting to load a file.
    auto loadVSTask = DX::ReadDataAsync("SimpleVertexShader.cso");

该文件存在于正确的位置,并且被证明可以工作。

代码在这里崩溃。_M_context._M_pContextCallback 无效。

   void _Reset()
    {
        if (_M_context._M_captureMethod != _S_captureDeferred && _M_context._M_pContextCallback != nullptr)
        {
            _M_context._M_pContextCallback->Release();
        }
    }

输出窗口给出:MyApplication.exe 中 0x00E34C89 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xCDCCDCD。

堆栈跟踪如下所示:

MyApplication.exe!Concurrency::details::_ContextCallback::_Reset() 第 620 行 C++ MyApplication.exe!Concurrency::details::_ContextCallback::operator=(const Concurrency::details::_ContextCallback & _Src) 第 563 行 C++ MyApplication .exe!Concurrency::task_continuation_context::operator=(const Concurrency::task_continuation_context & __that) C++ MyApplication.exe!Concurrency::task::_ContinuationTaskHandle,std::integral_constant,Concurrency::details::_TypeSelectorAsyncOperation>::_ContinuationTaskHandle, std::integral_constant,Concurrency::details::_TypeSelectorAsyncOperation>(const std::shared_ptr > & _AncestorImpl, const std::shared_ptr > & ContinuationImpl, const DX::ReadDataAsync::_l3:: & _Func, const Concurrency::task_continuation_context & _Context, Concurrency::details::_TaskInliningMode _InliningMode) 第 3292 行 C++ MyApplication.exe!Concurrency::task:: ThenImpl >(const DX::ReadDataAsync:: _l3:: & _Func, Concurrency::details::_CancellationTokenState * _PTokenState, const Concurrency::task_continuation_context & _ContinuationContext, bool _Aggregating, Concurrency::details::_TaskInliningMode InliningMode ) 第 3584 行 C++ MyApplication.exe!Concurrency::task::then< >(const DX::ReadDataAsync:: _l3:: & _Func) 第 2882 行 C++ MyApplication.exe!DX::ReadDataAsync(Platform::String ^ 文件名) 第 42 行 C++ MyApplication.exe!CubeRenderer::[Direct3DBase]::CreateDeviceResources() 行30 C++

所以 _ContextCallback 有问题,这就是我卡住的地方。

  • 这个上下文回调是什么?它似乎与从一个任务传递到另一个任务有关。
  • 如果它是无效的,那怎么会发生呢?
  • 如果只是没有正确设置,我该如何正确设置?

我可以让它工作,但它涉及更改应用程序中的所有子项目以使用 WinRT。不幸的是,这不是一个可接受的解决方案,因为其他子项目中的代码也在我的控制之外。我也想尝试了解这里实际发生了什么。

有什么见解或想法吗?谢谢!

4

2 回答 2

0

我在我的主 cpp 文件中添加了对 ppltasks.h 的引用。它使问题消失了,但我不知道为什么。

于 2012-07-05T15:30:38.457 回答
-1

在我的设置中,如果您在两个项目中包含标头,一个是 winrt,一个是普通项目,您会得到一个名为:“_PPLTASKS_WITH_WINRT”的检测不匹配,我猜这是标头或工具的较新版本,而不是可怕的运行时崩溃得到。

由此看来,如果您为某些而不是其他人启用了 winrt,则似乎无法混合使用 ppl 的静态库(或在引擎盖下使用 PPL 的 vs2012 异步库)。

我找不到任何官方文档。通过仅在关闭 winrt 的库中使用 ppl/std::async 解决了我的应用程序中的相同问题。我认为这不会是一个好的长期解决方案。注意只包括标题和朋友就足以解决这个问题。

于 2013-03-01T15:58:33.277 回答