问题标签 [message-pump]

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 投票
2 回答
2563 浏览

windows - 发送和接收 Windows 消息

Windows 消息似乎是通知 Windows 操作系统上的应用程序的好方法。它实际上运作良好,但我想到的问题很少:

如何为SendMessage 例程的lparam指定结构化数据(就像许多消息代码一样)?我的意思是……当然参数是一个指针,但是进程如何访问它呢?也许它是由发送/接收消息的进程加载的 DLL 分配的?

是否可以共享消息结构参数(在发送者和接收者之间)?它们在发送操作和窥视操作之间编组?如果是这种情况,是否可以通过修改结构化参数从调用方返回数据?这对 SendMessage 可能很有用,因为它是同步执行的,而不是 PostMessage 例程。

其他疑问...

PostMessageSendNotifyMessage有什么区别?

如果应用程序在处理消息泵时向自身调用 SendMessage,是否可能导致死锁?

0 投票
1 回答
2973 浏览

c# - 为什么会出现“对象当前正在其他地方使用”异常?

我有一个 C# WinForms 应用程序。当在启动主 UI 表单之前显示 DevExpress XtraMessageBox 时,静态 void Main() 方法中会引发此异常。以下是代码(简化):

虽然它是一个 DevExpress 控件,但实际上在调用以下命令时会引发异常:

异常不会始终如一地抛出。它可以在特定机器上重现,但是一旦我在异常之前添加一个 MicroSoft MessageBox.Show() 以显示调试信息,那么我就不再得到异常。这是堆栈跟踪:

更新: 我通过确保在执行任何 UI 工作之前执行 Application.Run() 来解决它。以这种方式启动消息循环/泵。我现在让 Application.Run() 启动启动画面,它轻量级且快速。然后我从启动表单中实例化主表单,激活它并隐藏启动表单。

0 投票
3 回答
1708 浏览

c# - 尝试/捕获 C# 中的所有异常

我想用 C# 在我的 UI 应用程序中捕获所有未处理的异常,以便我可以记录它们、通过邮件发送它们并重新启动应用程序。

我怎样才能简单地完成这项工作?我试过:

但它允许一些例外通过。

0 投票
1 回答
3136 浏览

c# - 如何使用自己的消息泵运行表单?

我有一个应用程序,我需要打开许多与我自己不同且独立运行的表单。然后我的应用程序继续阻止长时间运行的操作(使这些操作异步是不可能的)。所以我想用他们自己的消息泵在一个单独的线程上运行这些表单。

有什么办法吗?

0 投票
2 回答
319 浏览

windows - 测量 Windows 应用的 UI 响应能力

是否有任何衡量 WinForms/Windows 应用程序响应能力的指标?

类似于消息循环被阻塞的时间百分比?

如何获得?

0 投票
8 回答
35945 浏览

c# - 在长时间运行期间泵送 Windows 消息?

我正在运行的大型操作中收到以下消息:

CLR 在 60 秒内无法从 COM 上下文 0x1fe458 转换到 COM 上下文 0x1fe5c8。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为避免此问题,所有单线程单元 (STA) 线程都应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息。

如何发送 Windows 消息,以便在长时间操作时不再出现此错误?

0 投票
2 回答
3921 浏览

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

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

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

有什么提示吗?谢谢

这是代码:

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

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

0 投票
2 回答
789 浏览

c++ - 每个 VCL 表单都应该有自己的消息循环/泵用于线程吗?

我正在尝试在我的最新项目中实现 MVP 模式。目前使用 C++ Builder 2007 附带的 VCL 库。我的想法是我不需要执行 Application->Run(),或者更糟糕的是 Application->CreateForm(),它创建一个主窗体并在该窗体上循环。我不想要一个主表单,我想要一个主Presenter

然后我的问题变成了如何创建线程化的 TForms?

选项 1: 如果只有一个消息循环(Presenter),那么我系统中的每个随机线程都必须向该主线程发布消息并让它创建表单。

选项 2: 每个表单都有自己的消息循环。现在随机线程可以根据需要新建和删除它们。发布消息仍然用于它们之间的通信。

如果建议使用选项 2,是否有人对实施这种方法有任何建议?

编辑: 我如何更改以下内容以允许使用new创建表单并仍然允许循环工作?

0 投票
1 回答
511 浏览

wpf - WPF 应用程序调用需要消息泵的 API;Dispather.Run() 导致问题

我有一个使用非 WPF 供应商库的 WPF 应用程序。我的应用程序没有收到库触发的任何事件。有人告诉我这是因为我需要一个消息泵。

另一个(非常相似的)问题中,接受的答案建议使用 System.Windows.Threading.Dispatcher.Run()。

但是,当我添加该调用时,我的窗口不会弹出——该应用程序实际上是后台运行的,我必须使用任务管理器将其关闭。

我真的很困惑,我什至不知道如何调查它。任何帮助将不胜感激。

0 投票
1 回答
133 浏览

compact-framework - 总结 Windows 消息队列的内容?

我们有一个 CF.NET 3.5 应用程序,在出现特定错误之前似乎可以正常工作大约 4 小时:一旦出现错误,在调用相应的 ..._MouseDown 事件之前,在鼠标单击后会有大约 30 秒的延迟。这向我表明消息泵存在一些损坏,或者可能是 Windows 消息队列中的内容过多。任何人都可以提出有关如何攻击此错误的想法,特别是因为每次尝试都需要至少 4 个小时来测试...
谢谢!
PS - 大量非托管代码混合在一起,C++ 错误会与 .Net 消息队列混淆吗?