【发布时间】:2013-01-05 09:40:13
【问题描述】:
我正在编写一个通过 USB 与硬件通信的接口 Dll。为了完全满足硬件的时序要求(防止它在没有操作消息的情况下超时等),只要我的“Open()”方法被调用,我就会为每个延迟初始化创建一个工作线程。当我的“close()”方法被调用时,我设置了一个名为“terminate”的事件,该事件由工作线程监视并等待工作线程终止。终止最多需要几百毫秒,因为需要与硬件交换一些消息。
到目前为止一切顺利,唯一的问题是当程序卸载 Dll 而不调用我的“Close()”方法时...我通过在 DllMain (PROCESS_DETATCH) 中设置“终止”事件解决了这个问题,我很漂亮当然,我可以这样做并且仍然可以填写最佳实践。唯一的问题是,如果 Dll 在没有调用 close 的情况下被卸载,但在旧工作线程终止之前再次重新加载,我会导致加载我的 Dll 的进程超时,因为我正在等待旧工作线程完成。
所以这是我的问题:如果我仅在工作线程存在且正在卸载时(通过freeLibrary) 而不是当我的整个进程被终止时,我通过查看 lpvReserved 参数进行测试?
另外:有没有更好的方法来解决我的问题?
【问题讨论】:
-
我不确定,如果这是对您问题的回答,但至少是相关的:blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx
-
我希望你不是在等待线程退出?因为这不能在 DllMain 中完成。
-
你能要求程序在卸载你的库之前必须调用 Close() 吗?
-
@MarcSherman 这确实是一个要求,只是我无法控制加载我的 DLL 的程序,而且它似乎并不关心我的要求
-
@Sergius 是的,除此之外,我正在等待一个线程完成......有什么解决方法?
标签: c++ multithreading winapi dll