【问题标题】:DirectX 10 IDXGISwapChain::GetBuffer Multithread CTD ErrorDirectX 10 IDXGISwapChain::GetBuffer 多线程 CTD 错误
【发布时间】:2017-04-26 02:22:37
【问题描述】:

我正在尝试创建一个多线程程序,其中所有渲染都在主线程上完成,而消息处理(和窗口创建)在辅助线程上完成。初始化函数中的以下代码行SwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (void**)&back_buffer);在将初始化函数放在主线程时会产生访问冲突错误(0xc0000005)。

如何在不将初始化函数放在辅助线程上的情况下修复此错误?

编辑:我已经发布了所有相关代码here

【问题讨论】:

  • 除非您提供Minimal, Complete, and Verifiable example 或至少提供初始化部分,否则无法猜测到底出了什么问题。使用单独的渲染线程的方法可以工作(甚至是首选),但是应特别注意处理可能的死锁并防止并发调用 DXGI 方法。
  • 我已经放置了一个指向包含所有相关代码的 GitHub 存储库的链接。
  • 您的代码缺少错误处理。您必须检查所有 HRESULT 返回值并检查 DX 调用是否实际成功。
  • 错误处理在崩溃的代码行上被证明是无用的。但是,Visual Studio 调试器告诉我 SwapChain 是 nullptr。所以我在前一行进行了错误检查,它为D3D10CreateDeviceAndSwapChain 记录了“-2005270527”。

标签: c++ multithreading visual-studio directx-10


【解决方案1】:

在 Application.cpp 的第 49 行,while (HWindow != nullptr); 正在等待 HWindow 成为 nullptr。但是 HWindow 被初始化为nullptr,因此 while 循环会跳过并尝试初始化一个尚未创建的窗口。

该行现在显示为while (HWindow == nullptr);。这意味着循环一直运行到创建窗口为止,从而阻止了不存在的窗口的初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多