加载 DLL 阻塞 UI 线程
Posted
技术标签:
【中文标题】加载 DLL 阻塞 UI 线程【英文标题】:Load DLL blocking UI thread 【发布时间】:2011-12-07 00:20:12 【问题描述】:在我的应用程序中,某些 dll 仅用于特定操作,而 99.9% 的使用操作不会发生。因此,为了节省加载时间和内存,这些加载是根据需要使用LoadLibrary
动态加载的。
为了让用户了解并响应程序库正在一个单独的线程上加载,然后在它们可用时通知 UI 线程并且该过程可以继续。
但是在我的实验中,当LoadLibrary
运行时,UI 线程被锁定并且事件队列无论如何都没有被处理,从而使应用程序锁定并且屏幕不再重绘。
LoadLibrary
上的 MSDN 未提及此行为,是否可以在事件队列仍在处理时在一个线程中加载 dll?
【问题讨论】:
UI 线程停止发送消息时在做什么? (也就是说,如果你附加调试器并在它不抽水时中断,它在调用什么?) 好主意忘了做,我会检查 这是不必要的自我惩罚。使用链接器的 /DELAYLOAD 选项。 如果加载的 dll 中的 dllMain 需要很长时间,则 loaderLock 保持同样的时间。那么很容易想象 GIU 线程会在 loaderLock 上被阻塞。正如詹姆斯建议的那样,使用调试器应该也很容易。 【参考方案1】:异步加载 dll 时没有问题,这与 Visual Studio 调试器从符号服务器查找新加载的 dll 的符号有关。
当符号服务器被禁用或应用程序在没有调试器的情况下运行时,LoadLibrary
的执行不会出现锁定
【讨论】:
以上是关于加载 DLL 阻塞 UI 线程的主要内容,如果未能解决你的问题,请参考以下文章