Winapi 更改USERPostMessageLimit的后果

Winapi 更改USERPostMessageLimit的后果,winapi,Winapi,我们的一个遗留应用程序严重依赖PostThreadMessage()进行线程间通信,因此我们在注册表中增加了USERPostMessageLimit(远远超过正常的10.000) 但是,MSDN上的文档指出“此限制应足够大。如果您的应用程序超出此限制,则应重新设计,以避免消耗如此多的系统资源。”[] 有谁能告诉我到底是如何消耗太多的系统资源的?系统资源到底是什么?我能否以某种方式监视应用程序对系统资源的使用情况?任何信息都将非常有助于决定是否值得花时间和精力重新设计此应用程序。它引用的资源是线程

我们的一个遗留应用程序严重依赖
PostThreadMessage()
进行线程间通信,因此我们在注册表中增加了USERPostMessageLimit(远远超过正常的10.000)

但是,MSDN上的文档指出“此限制应足够大。如果您的应用程序超出此限制,则应重新设计,以避免消耗如此多的系统资源。”[]


有谁能告诉我到底是如何消耗太多的系统资源的?系统资源到底是什么?我能否以某种方式监视应用程序对系统资源的使用情况?任何信息都将非常有助于决定是否值得花时间和精力重新设计此应用程序。

它引用的资源是线程用于接收/处理消息的资源。您可以使用Taskmanager监视线程池大小和其他资源(查看视图->选择列)。它可能会帮助您识别特定的资源。如果使用者被资源锁定,请查找即使在线程增加的情况下也会达到最高的资源计数


但是,;如果您需要增加USERPostMessageLimit,那么消息生产者只是在重载消息消费者;通过增加这个限制,你的问题更加复杂,而不是解决它。将USERPostMessageLimit还原为默认值,如果消息生产者无法发布消息,请在重试之前尝试休眠,从而允许使用线程清除一些消息

您能否指定任务管理器中的哪些“流程页面列”(句柄、线程、用户对象等)需要监控并与这10000个限制进行比较?我测试过一个程序,由于这个限制,“没有足够的配额来处理这个命令”,该程序崩溃了,但我没有看到一个列增长到10000。这些列中有没有显示队列中到底有多少人?对不起,这个问题很久以前就得到了回答,我对这个问题的了解已经很模糊了。10k限制是消息而不是资源限制,每种资源类型将具有不同的容量,并且不是1:1的比率。这是你需要注意的顶部。总的来说,解决方案是增加您的消息消耗。无法增加发送更多邮件的容量。在我的情况下,我很难尝试增加邮件使用量,因为我的程序是Autodesk Revit的附加模块。我看不到正在调用的Revit API函数的内部,因此无法看到是什么导致消耗停止。我已经向Autodesk报告了该问题,但同时我增加了USERPostMessageLimit。我正在考虑使用相同的解决方案。你有什么问题吗?