【问题标题】:LoadLibrary in separate threadLoadLibrary 在单独的线程中
【发布时间】:2013-09-03 06:53:51
【问题描述】:

我正在使用 Visual Studio 2008 和 C++,并在运行时加载 DLL。但是,这会阻碍用户体验。我希望通过将其推送到新线程 (CreateThread) 来避免这种情况,但它仍然会阻塞 UI 线程。

为什么?

达斯汀

【问题讨论】:

  • LoadLibrary() 在阻止 UI 方面不能那么慢。你应该更多地解释你是如何做到的
  • 加载 DLL 是一个进程范围的操作,调用线程无关紧要。如果性能打击来自臃肿的DllMain(),恐怕你无能为力。
  • 可能您应该在程序的开头加载 DLL,这样它就不会过多地影响用户体验。但是当然,您可能想检查加载它时花费了这么多时间的人。例如。分配太多内存导致系统交换?
  • @FrédéricHamidi:有些部分是全流程的,例如加载程序锁定,但这不会影响性能。 DllMain 部分确实会影响性能,但不是进程范围的(仅在一个线程上运行,这就是调用线程确实很重要的原因)。

标签: c++ multithreading visual-c++ dll loadlibrary


【解决方案1】:

作为猜测,DLL 正在其DllMain 中执行在该上下文中不允许的操作。很少允许,因为它在加载程序锁定下运行。

【讨论】:

  • 但是为什么会阻塞 UI?
  • @usr:因为微软在设计 Windows 时并没有假设你违反了规则。我无法预测 Windows 内部是如何工作的,我只知道当您在DllMain 中尝试过多时会发生坏事@
  • 这个,以及上面证实的 cmets,就是它。加载的 DLL 的 DllMain 中存在大量逻辑。我通过将该逻辑移动到随后在 LoadLibrary() 之后调用的导出调用来修复它。我不知道进程锁。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
相关资源
最近更新 更多