问题标签 [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.
c# - Application.Run 在 Application.Exit 在同一个线程上之后不起作用
我的工作要求是首先显示一个启动屏幕,该屏幕从用户那里获取一些数据,对他进行身份验证并启动另一个表单。因此,我使用 Application.Run 启动初始屏幕,一旦完成,调用 Application.Exit 然后再次调用 Application.Run 以获取新表单。但是,这不会启动新表单。我创建了一个新线程并将其 ApartmentModel 分配为 STA 以启动新表单。
我想了解为什么 Application.Run 在调用 Application.Exit 后不起作用?
示例代码:
c++ - Win32 消息泵,DispatchMessage() 是处理整个消息队列还是仅处理顶部消息?
所以我一直在阅读 Win32 消息泵,我很好奇 DispatchMessage() 函数是处理整个消息队列,还是只处理队列顶部的消息?
例如,我见过这样的循环:
在此示例中,是否会处理每条消息,或者此循环结构是否会导致每帧仅处理一条消息?
如果它一次只处理一条消息,我是否应该将 if(PeekMessage) 语句更改为 while 循环以确保处理所有消息?:
c# - 'Invoke' 和 'BeginInvoke' 被调用但从未解决
我正在处理一个软件的 GUI 线程。我必须在需要从底层 API 不断轮询的 GridView 数据中显示。我创建了一个名为更新数据的方法,并尝试使用and/orSync()
使其线程安全。该方法每五秒左右由一个计时器调用一次。BeginInvoke
Invoke
Sync
的主体Sync
从未被调用,因为出于某种原因,我的请求似乎从未从消息泵中提取。编码:
日志如下所示:
永远不会打印其他消息。
对于BeginInvoke
. “End Invoke ...”被打印,但“inside body ...”从不打印。
我在 Unity3D 和 MonoDevelop 之上运行(如果这改变了任何东西)。
c# - 等待 COM 事件完成
如何在等待 COM 事件完成时阻止 UI 线程。我订阅了 COM 的更新事件,表明事件已完成。
我不拥有 COM 代码,也无法对其进行更改。
我尝试了 AutoResetEvent,但是它阻止了 UI 线程并且我没有收到来自 COM 的更新。
c# - 最有效的带锁事件处理设计模式
我有一个应用程序从 API 异步接收事件,并且可以在这个 API 上同步调用方法。
出于线程安全的目的,我需要锁定应用程序中的每个同步函数和每个事件处理程序。
但是,同步调用 API 方法可能会导致 API 在不同的线程上引发事件,并在返回之前等待它们被处理。
因此,这可能会导致死锁,因为 API 将等待要处理的事件继续进行,但在我的类中,同步对象将被两个不同的线程命中,程序将挂起。
我目前的想法是,尝试锁定而不是锁定事件处理程序,如果不可能(例如,如果事件是由另一个线程上的同步调用产生的)在队列/消息泵中缓冲事件。
在释放同步函数调用的锁之前,我会调用一个ProcessPendingEvents()
函数,以便可以在没有死锁的情况下处理事件。
对于这种情况,你有什么设计模式可以推荐吗?我对任何事情都持开放态度。
这是一个简单的示例来说明我当前的暂定实现。我的真正目标是拥有一个尽可能以单线程方式运行的类:
c# - 哪些阻塞操作会导致 STA 线程泵送 COM 消息?
当在 STA 线程上实例化 COM 对象时,该线程通常必须实现消息泵,以便编组对其他线程的调用(参见此处)。
可以手动泵送消息,也可以依靠一些(但不是全部)线程阻塞操作将在等待时自动泵送与 COM 相关的消息这一事实。该文档通常无助于确定哪个是哪个(请参阅此相关问题)。
如何确定线程阻塞操作是否会在 STA 上泵送 COM 消息?
到目前为止的部分列表:
阻塞泵*的操作:
Thread.Join
WaitHandle.WaitOne
//WaitAny
(WaitAll
WaitAll
虽然不能从 STA 线程调用)GC.WaitForPendingFinalizers
Monitor.Enter
(因此lock
) - 在某些条件下ReaderWriterLock
- 阻塞集合
阻塞不泵送的操作:
Thread.Sleep
Console.ReadKey
(在某处读到)
*注意Noseratio 的回答说,即使是抽水操作,也是为了一组非常有限的未公开的 COM 特定消息。
c# - 如何添加自定义消息泵支持参数?
这与这个问题有关: 如何创建自定义消息泵?
我基本上需要相同的消息泵,除了它还需要能够支持输入参数。上述问题的答案仅支持不接受参数的 Action() 委托。我希望能够将参数传递给我的操作。这是无参数版本:
这样做的正确方法是什么?我正在考虑让 BlockingCollection 存储一个自定义类而不是 Action,假设称为 ActionWithParameter,它看起来如下所示:
但它看起来很笨重,而且在获取动作时我还需要一些 switch 语句来确定参数是什么类型,以便能够调用动作(参数)。另外,如果我想支持多个参数怎么办?那我应该用object[] parameters
吗?肯定有更好的解决方案吗?
c++ - 防止“d3d9.dll”函数“D3D9SetMode”调用“ChangeDisplaySettingsExA”
我正在使用包装 DirectX 的第三方 .dll d3d9.dll
,修改原始 .dll 的执行。Fraps 使用了此类设置的一个众所周知的示例。
我正在多头模式(D3DCREATE_ADAPTERGROUP_DEVICE)下创建一个全屏独占设备。
当从 .dll 调用特定函数时,我遇到了一个问题,即 .dll 包装器退出我的程序D3D9SetMode
。
这是 WinDbg 在ChangeDisplaySettingsExA
调用函数时因中断而生成的部分调用堆栈:
我已经计算出这WM_ACTIVATE
是在此发生之前要处理的最后一条消息。
我曾尝试针对 DirectX9 2005 年 2 月和 2007 年 SDK(d3dx9_24.dll
和d3dx9_32.dll
分别)进行构建——它们都有同样的问题。
我怀疑有一个标志或设置方案来阻止调用ChangeDisplaySettingsExA
. 我尝试过D3DCREATE_NOWINDOWCHANGES
创建设备但没有成功。
任何链接,信息,想法?
c# - Why windows forms application could stuck in user32!__ClientWaitMessageExMPH?
I have multithreaded .net 4 windows forms application, that sometimes just stop to answer to user actions and Invoke() calls.
I have made a dump during this hang, and seems that main thread is blocked inside of waiting for user input.
Here is stack trace for main thread: http://pastebin.com/dVee3T0N
Why did it suck there, and could I lock something, that can be used in message pump, I did not lock any of native things directly.
After hang began - CPU usage of main thread is zero.
c# - Clean messages in Windows Message Pump
- I don't know much about Windows Message Pump but I guess events are triggered using Message Pump.
When my Web browser control navigates to some websites it fires various events of Document Completion. Once I have what I need in WebBrowser_Document_Completed() I want to ignore all further Document Completion.
- How can I it?
If I show a MessageBox() in Document_Completed(...), It shows multiple message boxes, looks like it is running in parallel threads, but when I debug it I find that it runs always on main thread.
- When are the other two threads created?
Also, when I press Close it closes the window but the process is still running in the background. I am not using any other thread yet I still see two other threads when I debug.