问题标签 [message-loop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
205 浏览

ruby - Using WIN32OLE_EVENT::message_loop not in Main thread Issue

I'm trying to create Ruby script that allow me to get OLE events during execution of main script. I've moved WIN32OLE_EVENT::message_loop to another Thread and expect this will call my event handlers simultaneously during execution of other script parts. For example, main goal of this sample script is connect to device and get event messages (just puts it to stdout) during execution of irb console.

When i execute this script (but you can't run it because some stuff skipped) i got irb console where i can access to objects that manipulate my USB device that connected to Windows and call some methods that fired different events and i expect these events inside esc.on_event block just to see output to stdout. But this block never called. But if i will write 'exit' in irb console i will get my events because last line in sample script WIN32OLE_EVENT::message_loop!

Looks like calling message_loop working only in main Thread and calling it inside other thread not give any results.

Any ideas how to get it working? Feel free to ask additional questions. Thanks.

0 投票
2 回答
1520 浏览

multithreading - 如何终止具有单独消息循环的线程?

我正在为SetWindowsHookExAPI 编写一个实用单元。

要使用它,我想要一个这样的界面:

在我当前的实现中,TKeyboardHookThread我无法使线程正确退出。

代码是:

AFAICS 只有在线程中有消息循环时才会调用挂钩过程。问题是我不知道如何正确退出这个消息循环。

我尝试使用TForm属于线程的隐藏来执行此操作,但消息循环不处理我发送到该窗体的窗口句柄的消息。

如何正确执行此操作,以便消息循环在线程关闭时终止?

编辑:我现在使用的解决方案看起来像这样(并且像魅力一样工作):

0 投票
2 回答
10939 浏览

multithreading - 如何退出线程的消息循环?

后台线程可以配置为接收窗口消息。您将使用PostThreadMessage. 退出该消息循环的正确方法是什么?

背景

在您可以将消息发布到后台线程之前,该线程需要确保通过调用创建消息队列PeekMessage

现在外界可以向我们的线程发布消息:

我们的线程位于一个GetMessage循环中:

GetMessage我的问题是接收WM_QUIT消息并返回错误的正确方法是什么。

我们已经了解到,发布消息错误方式WM_QUIT是调用:

甚至还有一些人们采用这种方法的例子。来自 MSDN:

不要使用PostMessage函数发布WM_QUIT消息;使用PostQuitMessage

正确的方法是让“某人”打电话PostQuitMessagePostQuitMessage 是一个特殊函数,它设置与消息队列关联的特殊标志,以便在适当的时候GetMessage合成消息。WM_QUIT

如果这是一个与“窗口”相关联的消息循环,那么标准设计模式是当窗口被销毁并WM_DESTROY接收到消息时,我们捕获它并调用PostQuitMessage

问题是WM_DESTROY 由窗口管理器发送的。当有人来电时发送DestroyWindow。只发帖是错误的WM_DESTROY

现在我可以合成一些人工WM_PleaseEndYourself信息:

然后在我的线程的消息循环中处理它:

但是有没有一种规范的方法可以退出线程的消息循环?


但不要这样做

事实证明,不使用无窗口消息队列对每个更好。如果您没有发送消息的窗口,很多事情可能会在无意中被巧妙地破坏。

而是分配隐藏窗口(例如,使用 Delphi 的线程- unsafe AllocateHwnd)并使用普通的 old 向其发布消息PostMessage

我们可以有一个普通的旧窗口过程来处理消息:

当你想让线程完成时,你告诉它:

0 投票
3 回答
207 浏览

c++ - 消息循环在这个程序中的作用?还有几个问题

以下代码工作正常。当用户按下一个键时,它会发出消息。但有些事情我不知道。消息循环在这里的作用是什么?我读到调用会在窗口中SetWindowsHookEx(...)注册一个函数,当注册类型的事件发生时,窗口会自动调用相应的函数。毫无疑问,如果不给消息循环它的空间,我看不到输出。

编辑

退出程序(关闭控制台窗口)是否取消注册钩子?

编辑 2

Dispatch Message在这里起什么作用?根据文档,它会向窗口过程发送一条消息,但即使我排除了它,它也不会影响输出。

0 投票
3 回答
2436 浏览

c++ - Windows消息循环中的睡眠()?

a 在典型的无限窗口消息循环中是否Sleep(sometime)有用,或者它只是无用甚至有害?

一些示例包含Sleep,其中大多数不包含。

0 投票
1 回答
1496 浏览

c++ - 在 WM_CREATE 中创建子窗口,同一线程的相关性?

一个典型的模式是在 message 的消息回调 ( WndProc) 中创建一个子窗口WM_CREATE

我完全理解这是一个很好的机会,但以后再做会有问题吗?这样做的一个原因是子窗口是在同一个线程中创建的。但是还有其他原因吗?

在同一个线程(作为父线程)中创建子窗口有多重要?至于“父GUI对话框线程的子线程可以创建子窗口吗? ”这似乎不是一般问题?

0 投票
2 回答
784 浏览

android - 处理程序发布的可运行对象看到错误的对象状态(竞争条件?)

我在这里遇到了一个非常奇怪的问题,对象状态错误,我在使用Handler.postDelayed. 我使用它来安排 2D 绘图的绘图调用,并且此绘图代码检查某些状态字段(如整数和布尔值)。

现在,这些状态字段可能会我安排抽奖后发生变化,但是由于所有方法,甚至延迟调用都在同一个线程上执行(对吗?),因此不应存在由于共享状态而导致的可见性问题。

尽管如此,我有时会看到例如false在预定抽签中的标志,即使它不可能是,因为我true在安排抽签之前将其设置为并且不再触摸它。一些伪示例代码:

这怎么可能发生?我不完全确定 Android 是如何实现这些消息循环的,但我检查了调度绘制的方法和调度方法本身的线程标识,它们都在同一个线程(主 UI 线程)上调用。

这让我发疯,有人可以帮忙吗?

更新 我注意到问题是由于内部类检查了一次标志,而外​​部类检查了一次。绘制代码作为内部类的一部分运行,并看到标志处于正确状态,而外部类,即使它包含对内部类实例的引用,总是将标志视为假(不正确的状态)。我仍然不明白这个问题,但它似乎与类嵌套有关?

0 投票
2 回答
1899 浏览

wxwidgets - 通知 GUI 在 wxWidgets 中更新的最干净的方法是什么?

我有一个小型应用程序,如果某些事件发生在较低级别,例如套接字脱机或类似情况,它需要更新 GUI 元素。

在 Windows 中,我可以使用 PostMessage,它将通过链发送到所有 Windows,并且所需的可以相应地更新。

如何在 wxWidgets 中实现类似的功能?我不能使用 OnUpdateUI 或类似的东西,因为某些控件似乎根本无法处理。

目标窗口可以是一个或多个,它们可以是框架或控件,所以我在这里有点困惑。

有人有建议吗?

0 投票
4 回答
1673 浏览

c# - Application.Run()、Application.Exit() 和计时器

我有一个 winforms 应用程序,我将通过任务调度程序调用它来下载文件并将它们插入数据库。但是,文件何时可用是不可预测的,因此我使用 timer ( System.Windws.Forms.Timer) 来轮询文件。

在上面的代码片段中,OptionsTradedTimer/OptionsStatsTimer都轮询文件,然后开始以 . 结尾的进程Application.Exit()。这运行得很完美,但之后它陷入了无限的消息循环。我认为这Application.Run()会在第一个计时器滴答后立即被调用,因此当Application.Exit()最终被调用时,它将结束消息循环。但是,如果我单步执行代码,然后Application.Exit()程序将返回到它起源的 timer.tick(),然后继续Application.Run()到底部。底部的Application.Run()是必要的,因为没有它,计时器只会滴答一次,然后应用程序将退出。

那么如何正确地告诉应用程序退出呢?或者我应该在哪里打电话Application.Run()

0 投票
1 回答
183 浏览

c# - 无法在 C# 中更新 UI 组件

我正在编写一个程序来监视网络上各种设备的状态。这些设备的详细信息存储在一个文件中。HandleClientComm 类从文件中读取有关这些设备的信息并与它们建立 tcp 连接。读取文件后,使用 manEvent 进行通知。为每个设备调用 UpdateGUI 函数。当 data.caller 等于 1 时,它会为该设备添加控件,但禁用组框。函数 hd.StartThreads 使用 Threadpool 侦听来自各种设备的连接。接受连接后,将再次调用 UpdateGUI 函数,其 data.caller 值为 2。我的问题是未启用 groupbox。消息框显示“开始”,但没有结束。尝试访问除组框以外的其他控件,但发现我无法从那里访问任何控件。消息循环是否有问题,因为我的代码中没有运行无限循环?