1

我无法在后台执行搜索操作,并在列表框内的前台向用户显示结果。

该程序用于SendMessage将查询结果发送回 GUI。

当程序关闭时,GUI 将全局(易失性)变量标记为“已完成”,并用于MsgWaitForMultipleObjects等待线程句柄,加入线程。

当我中断程序时,我看到一个死锁:GUI 正在等待后台线程终止,而后台线程正在等待SendMessage

当我使用 100 毫秒超时MsgWaitForMultipleObjects并在循环中调用它时,仍然会发生这种死锁,其中QS_ALLINPUT. 我不知道为什么。

这种设计是否正确?有没有更好的方法来等待线程终止?
如果不是,那是什么问题?

4

3 回答 3

1

您需要一个双缓冲方案以避免超出消息队列。像这样布置它:

线程 1 执行搜索并使用 PostMessage 发送结果。

线程 2 读取消息队列,有选择地删除搜索结果消息,并将它们存储在可以处理任意数量条目的基于内存的内部队列中。

线程 3 从内部队列中读取结果并显示出来。

请注意,您需要具有互斥锁保护的队列的 get/put API,以防止线程 2 和 3 相互踩踏。

于 2011-12-11T22:06:44.600 回答
0

这是经典的消费者/生产者模式。不要使用线程消息队列,使用自己的同步队列,最好是固定大小的。您的消费者(UI 线程)将按需减慢您的搜索线程。或者,如果您检测到同步队列太大,您可以过滤搜索结果以适应 UI 线程速度。

于 2011-12-11T22:36:13.290 回答
0

MsgWaitForMultipleObjects说“你有一条消息”之后,你必须去处理这条消息。您只有一次机会- 如果您没有这样做(并且只是循环返回并MsgWaitForMultipleObjects再次调用),该消息将不会被处理并且您将不会收到任何进一步的通知。

于 2011-12-12T01:38:58.733 回答