0

我正在使用 C++ managed 2010 在 form.h 文件中设计 GUI。GUI 充当主查询从卡的数据流。

按下按钮调用一个函数(在 ApplicationIO.cpp 文件中),其中使用 API win32 (CREATETHREAD(...)) 创建了 2 个线程:前者用于处理数据流,后者用于数据解析和在 GUI 上实时监控 grpah 的数据。

该项目有两种不同的行为:如果它以调试模式启动,它能够在数据流期间将 GUI 控件更新为文本框(使用调用)和图形,相反,当它在没有调试的情况下启动时,文本框中不会出现任何数据,并且数据显示非常慢慢上图。

有没有人解决过类似的问题?请问有什么建议吗?

4

1 回答 1

0

一个非常经典的错误是过于频繁地使用 Control::Begin/Invoke() 。您将使用委托调用请求淹没 UI 线程。UI 更新往往很昂贵,您很容易进入消息循环无法执行其低优先级职责的状态。就像绘画一样。这很容易发生,每秒调用超过一千次是危险区域,具体取决于委托目标花费的时间。

您可以通过以实际速率发送更新来解决这个问题,这种速率利用人眼区分它们的能力。在每秒 25 次的情况下,更新会变得模糊,再快点更新只会浪费 CPU 周期。这为 UI 线程留下了很多时间来完成它需要做的事情。

当更新成本很高时,这可能仍然不够慢。此时您需要跳过更新或限制工作线程。请注意,Invoke() 会自动限制,BeginInvoke() 不会。

于 2011-03-18T23:54:42.563 回答