我们有一个应用程序,它有一个或多个文本控制台窗口,它们基本上都代表串行端口(文本输入和输出,逐个字符)。这些窗口已成为当前代码方式的主要性能问题......我们设法在其中花费了大量时间。
当前代码的结构是让窗口生活在自己的小生命中,主应用程序线程通过“SendMessage()”调用驱动它。这种消息传递似乎是令人难以置信的开销的原因。基本上,绕过操作系统感觉是错误的。
请注意,我们会在适当的位置绘制整个文本行,以便轻松优化。
我不是Windows编码的专家,所以我需要询问社区是否有其他架构来驱动窗口中的文本显示而不是发送这样的消息?它似乎非常重量级。
请注意,这是在C ++或纯C中,因为主应用程序是可移植的C / C ++ /其他语言程序,也可以在Linux和Solaris上运行。
我们做了一些调查,似乎有一半的开销是使用SendMessage准备和发送每条消息,另一半是实际的屏幕绘制。 SendMessage在同一文件中的函数之间完成...
所以我猜以下给出的所有建议都是正确的:
你能接受所有答案吗?
答案 0 :(得分:1)
你应该正确地尝试分析,但是代替那些我会不再担心SendMessage,这几乎肯定不是你的问题,并考虑重新绘制窗口本身。
你描述这些是'文本控制台窗口',但后来说你有多个 - 它们实际上是Windows控制台吗?或者它们是您的应用程序正在绘制的东西?
如果是后者,那么我会考虑测量我的绘画代码,以及我是否在每次更新时使窗口失效太多。
答案 1 :(得分:1)
输出窗口是同一应用程序的一部分吗?几乎听起来他们不是......
如果是,您应该查看Observer design pattern以远离SendMessage()。我已将它用于相同类型的用例,并且它对我来说非常有效。
如果您无法做出类似的更改,也许您可以将输出缓冲为100毫秒,这样您每秒就不会有这么多外出消息,但它也应该以舒适的速率更新。
答案 2 :(得分:1)
我同意Will Dean的说法,控制台窗口或文本框中的绘图本身就是性能瓶颈。您首先需要确保这不是您的问题。你说你画了每一行作为一个整体,但即使这可能是一个问题,如果数据吞吐量太高。
我建议您不要使用SendMessage将数据从主应用程序传递到文本窗口。相反,使用其他一些沟通方式。这些是在同一个过程中吗?如果没有,您可以使用共享内存。在某些情况下,即使磁盘中的文件也可以。让主应用程序写入此文件并从中读取文本控制台。您可以向文本控制台发送SendMessage通知,以通知它更新视图。但是每当新线路到达时都不要发送消息。定义两次后续更新之间的最小间隔。
答案 3 :(得分:0)
输出窗口是否属于 相同的申请?它几乎听起来 就像他们不是......
是的,他们都在同一个过程中。
我没有编写这段代码......但似乎SendMessage在这个应用案例中有点沉重。
您描述的是'文本控制台 窗户',但后来说你有 多个 - 他们实际上是 Windows控制台?或者是他们 你的应用程序正在绘制什么东西?
我们的应用程序正在绘制它们,它们不是常规的Windows控制台。
请注意,当用户键入控制台时,我们还需要返回数据,因为我们经常有交互式串行会话。可以认为它与您在串行终端程序中看到的非常相似 - 但使用外部应用程序显然比我们现在的更昂贵。
如果你不能做那样的改变, 也许你可以缓冲你的输出 为了你这样的100ms之类的东西 没有那么多外出的消息 每秒,但它也应该更新 以舒适的速度。
好点。现在,每个字符输出都会导致发送消息。
当我们在新行出现时向上滚动窗口,然后我们逐行重绘。
请注意,我们还有一个任意大小的回滚缓冲区,但向后滚动是一个性能要求低得多的交互式案例。