【发布时间】:2011-12-11 21:26:19
【问题描述】:
我无法在后台执行搜索操作,并在列表框内的前台向用户显示结果。
程序使用SendMessage 将查询结果发送回GUI。
当程序关闭时,GUI 将一个全局(易失)变量标记为“已完成”,并使用MsgWaitForMultipleObjects 等待线程句柄,加入线程。
当我中断程序时,我看到一个死锁:GUI 正在等待后台线程终止,而后台线程在 SendMessage 中等待。
当我对MsgWaitForMultipleObjects 使用 100 毫秒超时并在循环中调用它时,仍然会发生这种死锁,使用QS_ALLINPUT。我不知道为什么。
这个设计是否正确?有没有更好的方法来等待线程终止?
如果不是,那是什么问题?
【问题讨论】:
-
你能用
PostMesage代替SendMessage吗? -
@AndyT:我不这么认为——搜索线程比 GUI 线程运行得快,所以我可能会超出
PostMessage在内部执行的任何消息的缓冲。 -
为什么需要等待线程终止呢?有什么压倒一切的理由吗? PostMessage 可以排队 10000 条消息,但你不应该接近它。提供流控制的简单方法是在启动时创建一个小型对象/结构/任何您用于数据传输的池(即,一个带有 O/S/W 的生产者-消费者队列)。您的搜索线程从池中提取 O/S/W,填充它们并 PostMessages 关闭它们。在 GUI 线程中处理完消息后,将它们推回池中。如果搜索线程试图溢出,它将被阻塞。
-
@MartinJames:好吧,当程序关闭时,我有点需要它终止,哈哈......
标签: c multithreading winapi background-thread