我在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:访问冲突读取位置0xCDCDCDCD。
堆栈跟踪看起来像:
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)Line 3584 C ++ !MyApplication.exe并发::任务::然后< >(const DX :: ReadDataAsync :: _l3 ::& _Func)第2882行C ++ MyApplication.exe!DX :: ReadDataAsync(Platform :: String ^ filename)第42行C ++ MyApplication.exe!CubeRenderer :: [Direct3DBase] :: CreateDeviceResources()第30行C ++
所以_ContextCallback出现了问题,而这就是我遇到的问题。
我可以让它工作,但它涉及更改应用程序中的所有子项目以使用WinRT。不幸的是,这不被认为是可接受的解决方案,因为其他子项目中的代码也不在我的控制之内。我也想尝试了解这里的实际情况。
任何见解或想法?谢谢!
答案 0 :(得分:0)
我在主cpp文件中添加了对ppltasks.h的引用。这会让问题消失,但我不明白为什么。
答案 1 :(得分:-1)
在我的设置中,如果你在两个项目中包含标题,一个是winrt和一个正常,你会得到一个名为“_PPLTASKS_WITH_WINRT”的检测不匹配,我猜这些标题或工具的新版本显示而不是一个可怕的你得到的运行时崩溃。
从这看起来你不能混合使用ppl的静态库(或者使用PPL的vs2012异步库)如果你为某些人而不是其他人启用了winrt。
我找不到任何官方文档。我在我的应用程序中修复了同样的问题,仅在关闭winrt的库中使用ppl / std :: async。我认为这不是一个很好的长期解决方案。注意只包括标题和朋友就足以解决这个问题了。