gpt4 book ai didi

c++ - 只要不是永远等待,就可以在 DllMain (PROCESS_DETATCH) 中等待吗?

转载 作者:太空宇宙 更新时间:2023-11-04 14:10:50 24 4
gpt4 key购买 nike

我正在编写一个通过 USB 与硬件通信的接口(interface) Dll。为了完全满足硬件的计时要求(防止它在没有操作消息的情况下超时等),我在调用“Open()”方法后立即为每个延迟初始化创建一个工作线程。当我的“close()”方法被调用时,我设置了一个名为“terminate”的事件,该事件由工作线程监视并等待工作线程终止。终止最多需要几百毫秒,因为需要与硬件交换一些消息。

到目前为止一切顺利,唯一的问题是程序卸载 Dll 时没有调用我的“Close()”方法...我通过在 DllMain (PROCESS_DETATCH) 中设置“终止”事件解决了这个问题,我很漂亮确保我被允许做并且仍然完全填充最佳实践。唯一的问题是,如果 Dll 在没有调用 close 的情况下被卸载,但在旧的工作线程终止之前再次加载,我会导致加载我的 Dll 的进程超时,因为我正在等待旧的工作线程完成。

所以这是我的问题:如果我只在工作线程存在时并且只有在我被卸载时(通过freeLibrary) 而不是当我的整个进程被终止时,我通过查看 lpvReserved 参数来测试?

另外:是否有更好的方法来解决我的问题?

最佳答案

唯一会发生的事情是让调用 FreeLibrary 的线程(FreeLibrary 不是异步的,它等待返回值)等待直到您的模块正在卸载。

我制作了一些 DLL,有时甚至是像 while(!IsDebuggerAttached()){} 这样的循环,在 DLLMain 附加/分离中,我测试的程序的行为就像他们需要的那样。

p>

至于其他问题解决方案:除了具有相同功能的 DLLMain 附加/分离之外,为什么还需要其他任何东西?

关于c++ - 只要不是永远等待,就可以在 DllMain (PROCESS_DETATCH) 中等待吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14453805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com