我在后台执行搜索操作,并在列表框内的前台将结果显示给用户时遇到麻烦。

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

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

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

当我对MsgWaitForMultipleObjects使用100毫秒的超时并使用QS_ALLINPUT 在循环内调用它时,仍然会发生此死锁 我不知道为什么。

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

===============>>#1 票数:1 已采纳

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

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

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

线程3从内部队列读取结果并显示它们。

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

===============>>#2 票数:0

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

===============>>#3 票数:0

MsgWaitForMultipleObjects说“您有一条消息”后,您必须继续处理该消息。 只有一次机会 -如果您这样做失败(然后循环回并再次调用MsgWaitForMultipleObjects ),则该消息将未经处理,并且您将不会再收到任何通知。

  ask by Mehrdad translate from so

未解决问题?本站智能推荐: