升级到VS2012后进行调试时出现死锁和崩溃

时间:2013-12-06 16:12:14

标签: winforms visual-studio-2012 nvidia windows-7-x64 direct3d9

我的应用程序使用扩展System.Windows.Forms.UserControl的C ++ / CLI类,并包装使用Effects框架执行Direct3d9渲染的本机C ++类。在将我们的解决方案从VS2010 SP1升级到VS2012之前,一切都很顺利。

在生产机器中,应用程序运行良好,甚至比以前快一点。但是在调试时,我会随机获得两个可能的错误之一:

  1. 对纹理的LockRect调用永远被阻止
  2. 我在C:\Windows\SysWOW64\nvd3dum.dll版本9.18.13.3182中收到了访问冲突。
  3. 我使用的是Windows 7 Ultimate,64位,包含所有最新更新。我使用的是由双头Nvidia GeForce 210 GPU(一个来自VGA输出,另一个来自DVI和DVI-to-VGA适配器)的双显示器设置。

    由于这似乎是一个图形适配器问题,我所能想到的就是将Nvidia驱动程序升级到最新版本。这只会使错误更加频繁,导致我的开发盒无法用于调试。我的同事有类似的环境,根本没有遇到过这个问题。

    也许GPU有一些物理伤害?我该怎么检查?有关解决此问题的任何其他提示吗?

1 个答案:

答案 0 :(得分:0)

研究LockRect阻塞问题,我偶然发现许多声称默认情况下Direct3D9不是线程安全的。

点击了我。最近,我们并行化了一些直接更新纹理数据的本机代码(即没有调度)。因此有LockRect的并发调用。人们说Present是危险的电话,但我尝试设置CreateDevice D3DCREATE_MULTITHREADED行为标志,瞧,现在我调试顺利,没有崩溃或死锁。

警告:据说激活多线程标志会带来显着的性能开销,但在我的情况下它可以忽略不计(而且我正在使用帧抓取器进行实时视频)。