问题标签 [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 投票
1 回答
436 浏览

c - Win32:是什么让我的消息循环在该示例中无法正常工作?

我最近遇到了一种情况,我想在 Win32 中使用无模式对话框。

Win32:工具栏对话框似乎永远无法获得焦点并导致主窗口处理缓慢!?

我发现这是我的消息循环:

事实上,只要我没有任何无模式对话框,这个消息循环就可以正常工作,因为它与模式对话框完美配合,因为它们处理自己的消息循环。hWnd当我将实例替换为NULL. 我只是不明白其中的区别,只是似乎我收到的消息不是针对某个特定窗口的消息。

有人可以解释是什么让这个消息循环工作不正确吗?

作为这个:

完美无瑕!

0 投票
1 回答
162 浏览

winapi - 对于使用直接 windows api 的 windows 编程,我应该使用 MessageLoop 吗?

在 Windows 编程中我应该使用 MessageLoop 吗?

我看到任何程序都有 messageLoop 但在这段代码中,作者不使用 messageloop

代码片段:

0 投票
2 回答
3921 浏览

c# - 如何以编程方式退出第二个消息循环?

我正在尝试创建第二个消息循环以在 C# 中异步处理/过滤低级消息。它的工作原理是创建一个隐藏的表单,将它的 Handle 属性暴露为挂钩,并在单独的线程中运行第二个消息循环。目前我对结果非常满意,但我无法正确退出第二个循环。唯一的解决方法是将 IsBackground 属性设置为 true,因此第二个线程将在主应用程序退出时简单地终止(不处理所有待处理的消息)。

问题是:如何正确退出该消息循环以便第二个 Application.Run() 返回?我尝试了不同的方法来创建单独的 ApplicationContext 并控制各种事件(Application.ApplicationExit、Application.ThreadExit、ApplicationContext.ThreadExit),但它们都因我无法调试的竞争条件而失败。

有什么提示吗?谢谢

这是代码:

我以这种方式在主 Form 构造函数中使用它:

编辑:我的答案中的完整解决方案。

0 投票
2 回答
3300 浏览

c - Win32 消息循环:使用 GetMessage(&msg, NULL, 0, 0) 关闭窗口后退出?

如果我有以下代码,如何检测窗口何时关闭,以便退出?r似乎从来没有得到值,我需要为整个线程处理消息,而不仅仅是当前窗口。-1 0

0 投票
2 回答
4230 浏览

windows - 可可消息循环?(与 Windows 消息循环相比)

在尝试将我的游戏引擎移植到 mac 时,我偶然发现了一个基本(但很大)的问题。在 Windows 上,我的主要代码如下所示(非常简化):

我已经读到这不是 mac 方式。mac 方式是检查某种事件,例如屏幕的垂直同步以渲染新帧。但正如你所看到的,我想做的不仅仅是渲染,我还希望其他线程也能工作。某些线程的调用速度需要超过每 1/60 秒。(顺便说一句,我的线程基础结构是:线程将事件放入同步队列中,主线程调用 processEvents 处理主线程中同步队列中的项目。这用于网络内容、图像加载/处理内容、柏林噪声代等...等...)

我希望能够以类似的方式做到这一点,但是关于这方面的信息很少。我不介意将渲染放在垂直同步事件上(我也会在 Windows 上实现),但我希望对其余代码有更多的响应能力。

以这种方式看待它:无论如何,我都希望能够在 GPU 做事情的同时处理其余的事情,我不想等待垂直同步然后开始做应该已经被处理的事情然后才开始将东西发送到 GPU。你明白我的意思吗?

如果我需要从完全不同的角度来看待这个问题,请告诉我。

如果我需要为此阅读书籍/指南/教程/任何东西,请告诉我要读什么!

我不是可可开发人员,我不是 object-c 程序员,我的游戏引擎完全使用 C++,但我对 xcode 的了解足以让一个窗口出现并显示我在该窗口中绘制的内容。它只是不像我的 Windows 版本那样更新,因为我不知道如何正确处理它。

更新:我什至相信我需要某种循环,即使我想在垂直回溯上同步。MacOSX 文档上的 OpenGL 编程表明这是通过设置 SwapInterval 来完成的。因此,如果我理解正确,在 Mac 上实时渲染时,我总是需要某种循环,使用 swapInterval 设置来降低功耗。这是真的?

0 投票
2 回答
4202 浏览

windows - 是否可以在没有窗口的情况下使用 Windows Raw Input API(即来自控制台应用程序)?

是否可以在没有窗口的情况下使用 Windows Raw Input API(即来自控制台应用程序)?

我试过使用 RegisterRawInputDevices 但我的消息循环似乎没有从 GetMessage 获得任何事件,因此只是“挂起”。

0 投票
4 回答
4303 浏览

c# - C# - 等待 WinForms 消息循环

我必须编写一个 C# API 来注册全局热键。为了接收 WM_HOTKEY 消息,我使用 aSystem.Windows.Forms.NativeWindow并运行一个自己的消息循环System.Windows.Forms.Application.Run(ApplicationContext)。当用户想要注册一个热键时,他必须运行一个名为的方法,该方法RegisterHotkey()使用 停止消息循环System.Windows.Forms.ApplicationContext.ExitThread(),使用 (P/Invoke) 函数注册热键并RegisterHotKey()再次启动消息循环。这是必需的,因为RegisterHotKey()必须在创建窗口的同一线程内调用,而该线程必须在运行消息循环的同一线程内再次实例化。

问题是,如果用户RegisterHotkey()在启动正在运行消息循环的线程后不久调用该方法,则会在之前调用该方法,因此应用程序ApplicationContext.ExitThread()会无限期地阻塞。Application.Run(ApplicationContext)有人知道等待消息循环启动的方法吗?

提前致谢!

0 投票
2 回答
2305 浏览

sockets - 事件 SOCKET_DATA 没有收到 AS3 中的所有消息

我的 AS3 客户端程序在发送大量消息时没有收到发送给它的所有数据。我知道不是我的服务器导致了这个问题,因为所有消息都被正确接收和发送。我的 as3 客户端只是没有收到所有发送的数据。

你们中有人知道解决方案吗?

0 投票
2 回答
12716 浏览

c# - 实现 Win32 消息循环并使用 P/Invoke 创建 Window 对象

我的主要目标是纯粹使用能够处理 USB HID 事件的P/Invoke调用来实现正确的消息循环。毫无疑问,它的功能应该与以下在Windows 窗体中运行良好的代码相同。这个 NativeWindow 后代接收事件:

...由此事件循环提供支持:

我发现实现事件循环相当容易:

但我不知道应该如何创建底层的 Window 对象。NativeWindow 类的实现对我来说似乎太复杂了。

这是我目前的解决方案:

0 投票
1 回答
1528 浏览

qt - Qt QTcpSocket:如何防止readyRead信号中的死锁?

我在 Windows 7 上的 Qt 中需要一些帮助。似乎 QtreadyRead()信号是由异步过程调用发出的,这会导致代码在同一个线程中并发执行。

在我的示例中,我有一个队列,该队列应该由锁访问,DoRead()并且可以在其中访问。DoTimer()整个操作在 ui (main) thread中运行。但是有时会DoRead()发生所谓的死锁。代码在 中停止执行DoRead()。如果显示消息框并因此DoTimer()停止执行,则死​​锁是可重现的。但是我很惊讶地看到它OnRead()仍然被并发调用。对我来说唯一的解释是,这OnRead()是由 Windows APC 调用的。

请参阅 MSDN 文章异步过程调用

异步过程调用 (APC) 是在特定线程的上下文中异步执行的函数。当 APC 排队到线程时,系统会发出软件中断。下次线程被调度时,它将运行 APC 函数

我对readyRead()可能是 APC 的假设是否属实?

在任何一种情况下,我能做些什么来防止死锁?我需要访问队列DoRead()以填充队列并进入DoTimer()(当然还有其他方法)以读取、写入或删除同一队列中的条目。递归互斥锁不是解决方案,因为两个调用都发生在同一个线程中。

编辑 2:我发现这与 APC 无关。问题只是 QMessageBox 创建的额外消息循环。

而不是直接调用 QMessageBox,所有消息都将在任何队列操作之后排队并显示。

如果没有对队列的并发访问(没有多线程),则不需要锁。