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

该程序使用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

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

1回复

如果Background Worker是后台线程,我如何执行此代码?

研究发现, Background Worker是一个background thread ,但是,当我运行以下代码时,即使退出主过程, Background Worker仍会运行到最后。 这个功能不是保留给foreground threads吗? 码:
1回复

C语言中的多线程问题

我第一次尝试使用C进行多线程,但似乎做错了,希望您能为我提供帮助。 这是我的代码: 在此代码中,数组“ b”似乎可以很好地填充,但是数组“ a”却没有。 抱歉,答案很愚蠢! 编辑:我只是再次尝试,并且两个数组都是'0'。 不太确定发生了什么。 我正在使用Visual Stu
1回复

Android多线程连接游戏

我正在创建一个多人游戏。 现在,我要指出的是,我需要获取并跟踪客户端上所有传入的服务器消息。 我看到一个AsynTask类为我做后台工作。 您是否认为这是跟踪所有消息并将其传递给不同活动的方法,还是有更好的方法来做到这一点? 我怎么看这个: //或多或少的伪代码 另外,
2回复

从非UI线程更新视图

我对Android系统的工作方式感到困惑,尤其是在更新视图层次结构时。 我们都知道,除了UI(Main)线程之外,我们不应从任何其他线程更新任何视图 。 当我们尝试这样做时,甚至Android系统也会引发异常 。 前几天,我试图在应用程序中实现显示视图的自定义进度。 因此,我开始使用标准
1回复

多线程和参数混合

我有一个函数,该函数在被单个线程调用时可以正确运行(直接调用它,或者通过CreateThread()/ WaitForSingleObject()调用),但是在被多个CreateThread()和随后的WaitForMultipleObject()调用时似乎变得麻烦了呼叫。 从我尝试过的广泛调
1回复

在iOS上。 当应用程序发送到后台时,该应用程序仍在同一UI线程上运行还是移至新的不同线程上?

在iOS上。 当某个应用程序发送到后台时,该应用程序是否仍在同一UI线程上运行或是否移至新线程?
1回复

c多线程冲突

我试图使用多线程来允许两个任务在一个DLL中并行运行,但是我的应用程序一直崩溃,这显然是由于某些不良的资源冲突管理; 以下是详细信息:我需要沿着主逻辑流程从某个点调用相同的函数(DoGATrainAndRun),为其中一个参数传递一个不同的值,让两个参数运行,然后返回主逻辑流程,并使用从2个调
1回复

是不是UI线程的线程可以操作UI元素?

我已经读过,只允许UI线程操纵WinAPI中的UI元素。 但我认为,不是UI线程的线程甚至可能操纵UI元素。 我认为,因为当一个线程(不是UI线程)调用SendMessage()函数来操作某个UI元素时,会将一条消息发送到UI线程,然后它就是操作UI元素的UI线程而不是其他线程。
1回复

WinAPI多线程应用程序

我想创建一个WinAPI应用程序/窗口,并且由于我不想在等待消息时阻塞执行,因此我打算有2个线程; 主线程和应用程序线程。 应用程序线程将创建窗口(CreateWindowEx),然后在消息循环中阻塞。 我的困境来自想要修改应用程序一部分的主线程。 例如,更改样式,大小等。为了保持应
1回复

后台线程上的UWP位图图像

我有一个简单的问题。 在我的UWP应用中,当我尝试通过使用代码创建简单的BitmapImage时,我正在使用多个线程,而在后台线程中使用: var image=new BitmapImage(); 。 引发异常 该应用程序调用了一个已编组为不同线程的接口。 此异常发生在我