问题标签 [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.
.net - 向 Windows GUI 线程发送消息
我注意到,当您创建一个 Web 服务对象(从 SoapHttpClientProtocol 继承)并使用 Async 方法时,它会在 Windows GUI 线程上进行回调。
- 有谁知道这是如何工作的?
- 我怎样才能达到同样的目的。
如果我确定回调总是在 gui 线程上发生,我认为这将使我不必在我的 GUI 表单中检查 InvokeRequired。
c# - 在线程上下文中构造 NativeWindow 的问题
我正在创建一个 NativeWindow 子类('MyNativeWindow'),以便使用它的消息泵与一些旧的 DLL 进行通信。我的代码在 WinForms 应用程序中运行,但我想将 DLL 及其消息处理保留在 GUI 范围之外。
从应用程序上下文创建 MyNativeWindow 时(就在创建应用程序的主窗体之前),一切正常 - 调用 NativeWindow 的 WndProc 并处理事件。但是,当我使用线程初始化 MyNativeWindow 时,消息泵似乎不会运行。
NativeWindow的创建有什么限制吗?
c# - 运行多个 UI 线程
跳到底部的问题;这只是一些额外的信息
我正在使用一个组件(GeckoFX)来渲染一些网站,很好,但它只能在 Windows 窗体中使用;因为它必须绑定到可以绘制的 WinForms 对象。因为所有 WinForm 都在同一个线程中运行,所以我一次只能使用一个 GeckoFX 实例;所以我决定以 WinForm 的形式创建一个“工人阶级”,并在其中添加所有逻辑。该表单不需要与主表单进行通信。
现在我可以启动 10 个窗口,它们最终会工作,但是每个新表单都会在所有其他表单处理完所有 GeckoFX 事件之前等待,因为您不能在一个线程上使用多个实例。此外,浏览器必须在 UIThread 上。所以:
是否可以创建多个 UI 线程(每个表单一个)?
我见过有人这样做([编辑:删除“坏”链接]),但没有人让他的代码示例正常工作。让它工作的人最初使用某种形式的自定义消息泵来做这种事情,但我不知道如何实现这样的事情。
c# - 什么是消息泵?
在这个线程(大约一年前发布)中,讨论了在非交互式会话中运行 Word 可能带来的问题。那里给出的(相当强烈的)建议是不要这样做。在一篇文章中指出“Office API 都假设您在桌面上的交互式会话中运行 Office,带有监视器、键盘和鼠标,最重要的是,还有一个消息泵。” 我不确定那是什么。(我使用 C# 编程仅一年左右;我的其他编程经验主要是使用 ColdFusion。)
更新:
我的程序运行大量的 RTF 文件,提取两条信息用于构建医疗报告编号。我没有尝试弄清楚 RTF 中的格式化指令是如何工作的,而是决定只在 Word 中打开它们并从那里提取文本(而不实际启动 GUI)。有时,该程序在处理一个文件的过程中会打嗝,并留下一个打开的 Word 线程附加到该文档(我仍然需要弄清楚如何关闭该线程)。当我重新运行程序时,我当然会收到一个通知,说有一个线程在使用该文件,我想打开一个只读副本吗?当我说是时,Word GUI 突然从无处弹出并开始处理文件。我想知道为什么会这样;
c# - .NET Windows 服务中的消息泵
我有一个用 C# 编写的 Windows 服务,它为信息亭应用程序处理我们所有的外部硬件 I/O。我们的新设备之一是带有原生 DLL 中的 API 的 USB 设备。我创建了一个适当的 P/Invoke 包装类。但是,必须使用 Windows 应用程序的 HWnd 初始化此 API,因为它使用消息泵来引发异步事件。
除了向硬件制造商提出请求以向我们提供不依赖于 Windows 消息泵的 API 之外,还有什么方法可以在我的 Windows 服务的新线程中手动实例化一个消息泵,我可以将它传递给这个 API ? 我真的必须创建一个完整的 Application 类,还是有一个封装消息泵的较低级别的 .NET 类?
c# - “模拟” Application.Run 使用 Application.DoEvents
我遇到麻烦了。我正在尝试使用 Application.DoEvents 模拟调用 Application.Run ...这听起来很糟糕,然后我也接受了我的问题的替代解决方案...
我必须像 Application.Run 那样处理消息泵,但我需要在消息处理之前和之后执行代码。这是主要的重要代码片段。
这段代码由 Main 例程执行。实际上,我有一个内核类列表,它们在单独的线程中运行,这些线程处理用于在 OpenGL 中呈现的表单。我需要使用屏障来同步所有内核线程,这非常有效。当然,对于创建的每个 Form,我需要在主线程(Main 例程)中处理 Form 消息,实际上我调用 Application.DoEvents() 来完成这项工作。
现在我必须修改上面的代码片段以获得一个通用的表单(简单对话框),而不会像 Application.Run 那样消耗 100% 的 CPU 调用 Application.DoEvents()。
目标应该是让上面的代码片段在到达时处理消息,并仅在必要时发出渲染(释放屏障),而不是试图获得最大 FPS;应该有可能切换到严格循环以尽可能多地渲染。
怎么可能?
注意:上面的代码片段必须在 Main 例程中执行,因为 OpenGL 上下文是在主线程上创建的。在单独的线程中移动代码段并调用 Application.Run 非常不稳定和错误......
c++ - Windows默默捕捉到的异常,如何手动处理?
当异常在消息泵中抛出时,我们遇到了 Windows 静默吃异常并允许应用程序继续运行的问题。例如,我们创建了一个测试 MFC MDI 应用程序,并覆盖了 OnDraw:
运行应用程序时,您可能会收到令人讨厌的错误消息,但实际上您什么也得不到。该程序似乎运行得非常好,但是如果您检查输出窗口,您将看到:
Test.exe 中 0x13929384 处的第一次机会异常:0xC0000005:访问冲突写入位置 0x00000000。
Test.exe 中 0x77c6ee42 处的第一次机会异常:0xC0150010:被停用的激活上下文对于当前执行线程无效。
我知道为什么我会收到应用程序上下文异常,但为什么要静默处理呢?这意味着我们的应用程序在使用时可能会遇到严重的问题,但我们永远不会知道,因为我们的用户永远不会报告任何问题。
.net - 使用 .NET Framework 进行语音识别是否需要消息泵?
我正在编写一个插件(dll 文件),并且正在创建一个 WinForm 作为其界面/对话框。如果确实需要消息泵,我应该如何以及在哪里创建一个?
c# - 如何使程序不显示在 Alt-Tab 或任务栏上
我有一个需要坐在后台的程序,当用户连接到 RDP 会话时,它会进行一些环境设置,然后启动一个程序。当程序关闭时,它会做一些内务处理并注销会话。
我目前的做法是让终端服务器启动这个应用程序。这是作为 Windows 窗体应用程序构建的,以防止控制台窗口出现:
我真的很喜欢这个,因为任务栏中没有项目,alt-tab 中也没有任何显示。但是,为了做到这一点,我放弃了对像 So Now 这样的功能的void WndProc(ref Message m)
访问权限如果用户在关闭程序之前注销或断开会话。WTS_REMOTE_DISCONNECT
WTS_SESSION_LOGOFF
bool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags);
关于如何吃蛋糕和吃蛋糕有什么建议吗?