- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个需要以下功能的线程:
我对消息泵的初始实现使用了 GetMessage
, như được hiển thị bên dưới:
while not Terminated and GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
我发现的问题是,除非有消息,否则 GetMessage 将永远不会返回。这意味着,如果消息事件较少,可能需要相当长的一段时间才能再次检查已终止
.
我的第二个实现(受到 this answer 的启发)使用 MsgWaitForMultipleObjects
在检查之前等待消息存在(因为它有超时)
while not Terminated do
begin
if MsgWaitForMultipleObjects(0, nil^, False, 1000, QS_ALLEVENTS) = WAIT_OBJECT_0 then
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
end;
我发现的问题是 MsgWaitForMultipleObjects
在等待时阻塞线程。因此,当通过 SendMessageTimeout
向线程发送消息时,它会超时,而使用 GetMessage
时不会超时。
想到的解决方案是返回到 GetMessage
实现,但添加一个计时器以确保 WM_TIMER
消息每秒重置循环。
这真的是唯一的方法吗?看来应该有一些更好的方法来让线程在等待消息时保持响应。
1 Câu trả lời
My initial implementation of the message pump used GetMessage like:
while not Terminated and GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;The problem I found with that, is that GetMessage will never return unless there is a message. Meaning, if there is low message activity, it may be quite a while before it checks
Terminated
again.
您可以覆盖线程的虚拟 TerminatedSet()
方法通过 PostMessage()
hoặc PostThreadMessage()
向队列发布消息以“唤醒”GetMessage()
如果被阻止。
或者,让你的线程构造函数创建一个 TEvent
对象,并在线程的析构函数中释放它。然后让 TermatedSet()
发出该事件的信号。然后,您的循环可以使用 MsgWaitForMultipleObjects()
同时等待消息队列和事件。返回值将告诉您是否通过消息或事件满足了等待。
My second implementation (inspired by this answer) used
MsgWaitForMultipleObjects
to wait until a message exists before checking (since it has a timeout)while not Terminated do
begin
if MsgWaitForMultipleObjects(0, nil^, False, 1000, QS_ALLEVENTS) = WAIT_OBJECT_0 then
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
end;The problem I've found with this, is that
MsgWaitForMultipleObjects
blocks the thread while it waits. So, when a message is sent to the thread viaSendMessageTimeout
, it times out, where it doesn't when usingGetMessage
.
SendMessage...()
系列函数将直接将消息传递到目标窗口的消息过程,完全绕过消息队列。因此 MsgWaitForMultipleObjects()
Và (Get|Peek)Message()
永远不会报告来自 SendMessage...() 的已发送消息
,仅来自 PostMessage()
hoặc PostThreadMessage()
của发布消息(或合成消息,如 WM_TIMER
,WM_PAINT
等)。但是,当跨线程边界发送消息时,接收线程仍然需要执行消息检索调用(即(Get|Peek)Message()
),以便发送消息实际传递给窗口过程。
The solution that comes to mind is to go back to the
GetMessage
implementation, but add a timer to make sure aWM_TIMER
message resets the loop every second.
在线程内,最好使用 waitable timerCòn hơn là WM_TIMER
,那么您可以通过 MsgWaitForMultipleObjects()
使用计时器。但实际上,将 GetMessage()
Và WM_TIMER
一起使用与 MsgWaitForMultipleObjects()
与超时一起使用之间几乎没有什么区别,因此没有必要创建计时器浪费系统资源。
关于multithreading - 如何保持线程的消息泵 react 性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59076128/
我的应用程序包含两部分:网络部分和 GUI。它的工作方式有点像浏览器 - 用户从服务器请求一些信息,服务器发回一些代表某些 View 的数据,然后 GUI 显示它。 现在我已经将网络部分实现为一项服务
给定表达式字符串exp,编写程序检查exp中“{”、“}”、“(”、“)”、“[”、“]的对和顺序是否正确。 package main import ( "fmt" stack "gi
我想要一个简单的脚本在后台保持运行。目前看起来像这样: import keyboard while True: keyboard.wait('q') keyboard.send('ct
我维护着许多 RedHat Enterprise Linux(7 台和 8 台)服务器(>100 台),其中包含不同的应用程序。为了保持理智,我当然会使用 Ansible 等工具,更重要的是,公共(p
我有一个 winforms 应用程序,它在网络服务请求期间被锁定 我已经尝试使用 doEvents 来保持应用程序解锁,但它仍然不够响应, 我怎样才能绕过这个锁定,让应用程序始终响应? 最佳答案 最好
我正在努力在我的项目中获得并保持领先的 0。以下是当前相关的代码: Dim jobNum As String jobNum = Left(r1.Cells(1, 1), 6) r2.Cells(1
我正在尝试在我的 Canvas 中定位元素相对于我的背景。 窗口被重新调整大小,保持纵横比。 背景随着窗口大小而拉伸(stretch)。 问题是一旦重新调整窗口大小,元素位置就会不正确。如果窗口的大小
一直在玩弄 Hibernate 和 PostgreSQL,试图让它按预期工作。 但是由于某种原因,当我尝试将具有@OneToMany 关系的对象与集合中的多个项目保持一致时,除了第一个项目之外,所有项
我想将某些东西提交到 github 存储库,但我(显然)没有任何权利这样做。我对那个 repo 做了一个分支,提交了我的更改并提交了一个 pull-request。 现在,问题是过了一段时间其他人已经
这是一个初学者问题,我仍在考虑“在 OOP 中”,所以如果我错过了手册中的答案或者答案很明显,我深表歉意。 假设我们有一个抽象类型, abstract type My_Abstract_type en
我们正在开展的一些项目在 jQuery 1.4.2 或更早版本中有着深厚的根基,介于缺乏最新版本的性能优势(或语法糖)、使用现已弃用的方法的耻辱以及部署一个积极维护的库的 3 年以上旧版本,升级现在迫
我看到在FMDB 2.0中,作者为线程添加了FMDatabaseQueue。例子是: // First, make your queue. FMDatabaseQueue *queue = [FMDa
我在 NSScrollView 中有一个 NSTableView。 NSTableView 的内容是通过绑定(bind)到 NSArrayController 来提供的,而 NSArrayContro
我在 TreeView 上有一个节点,我手动填充该节点并希望保持排序。通过用户交互,TreeViewItem 上的标题可能会更改,它们应该移动到列表中的适当位置。 我遍历一个 foreach,创建多个
我从主 NSWindow 打开一个 NSWindow。 DropHereWindowController *dropHereWindowController = [[DropHereWindowCon
我需要放置一个 form 3 按钮,当我单击该按钮时,将其显示为按下,其他按钮向上,当我单击另一个按钮时,它应该为“向下”,其他按钮应为“向上” 最佳答案 所有按钮的属性“Groupindex”必须设
我有一个使用 AnyEvent::MQTT 订阅消息队列的 perl 脚本。 目前我想要它做的就是在收到消息时打印出来。我对 perl 完全陌生,所以我正在使用它附带的演示代码,其中包括将 STDIN
如何在 .NET 应用程序中保持 TreeView 控件的滚动位置?例如,我有一个树形 View 控件,并经历了一个向其添加各种节点的过程,并将它们固定在底部。在此过程中,我可以滚动浏览 TreeVi
我维护了大量的 vbscripts,用于在我的网络上执行各种启动脚本,并且有一些我在几乎所有脚本中使用的函数。 除了复制和粘贴之外,有没有人对我如何创建可重用 vbscript 代码库有建议。我并不反
我有一些关于 Azure 自托管的问题。 假设用户 Alex 在物理机 M 上设置了 Windows 自托管代理。当 Alex 注销且计算机进入休眠状态时,代理将脱机。现在,当 Bob 登录同一台计算
Tôi là một lập trình viên xuất sắc, rất giỏi!