SetWindowText慢,Win32 C ++

时间:2013-05-18 18:22:18

标签: winapi user-interface

我有一个简单的应用程序,我正在阅读一些内部变量并将它们发布到菜单上的EditControl。

以下是代码段

case 0:
        SetWindowText(GetDlgItem( gHWnd, IDC_PACKETID ), 
                     (LPSTR)std::to_string(long long(NC->mPacketNum)).c_str());
        break;

那里有很多事情要发生。我只是想将一个数字转换为可以在编辑对话框中显示的内容。这太慢了,只要输入这个部分就可以从50Hz下降到30Hz左右。

有什么想法可以显着提高速度吗?

3 个答案:

答案 0 :(得分:2)

我通过维护最后一次窗口更新的时间戳来解决这类问题。除非经过一定的时间,否则我会阻止另一次更新。 1/10秒似乎对我来说效果很好。性能显着提高,更新仍然很顺利。

答案 1 :(得分:2)

在该代码中发生了很多事情。

SetWindowText本身似乎不太可能是缓慢的部分。让我们一块一块地把它拆开,看看时间可能会去哪里。 (确切知道的唯一方法是分析,但我无法为你做到这一点,所以我正在寻找可能性。由你来衡量。)

SetWindowText(GetDlgItem( gHWnd, IDC_PACKETID ), 
              (LPSTR)std::to_string(long long(NC->mPacketNum)).c_str());
  1. GetDlgItem调用可能正在发送消息以遍历gHWnd的子窗口。如果有很多孩子,并且如果IDC_PACKETID不是第一个孩子,那么这可能需要一些时间。考虑计算一次并缓存结果。除非您销毁控件并创建一个新控件,否则HWND不会发生变化。

  2. 您正在使用ASCII字符串调用SetWindowText。 (为什么要投射结果?特别是,为什么要丢弃常量?)如果您使用的是现代版本的Windows,那么您的ASCII字符串将被动态转换为宽字符串,这可能涉及额外的动态内存管理。您可以调用SetWindowTextW(注意W后缀)并使用std :: to_wstring直接计算宽字符串。根据std :: to_wstring的实现细节,这可能会更快。

  3. 窗口真的是编辑控件吗?如果您以30-50 Hz的频率更改它,您似乎不太可能需要完整的编辑控件。你可以使用静态文本控件吗?它的实现可能更简单,更快。

  4. NC-> mPacketNum是否会长时间正确对齐?如果它没有对齐,这可能会对性能产生负面影响。看看你是否可以保证对齐。

答案 2 :(得分:1)

对于高帧率,您需要使用Direct2D或OpenGL渲染,而不是内置的EDIT窗口类。

如果您不需要高帧率,只需要高吞吐量,则可以执行InvalidateRect并仅在获得PAINT消息时更改文本。 Windows将限制它向您发送的费率WM_PAINT。或者使用计时器。通过这种方式,您只需将新值存储在内部变量中,当您获得绘制或计时器回调时,将其从区间变量移动到EDIT控件。