首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SetWindowText Slow,Win32 C++

SetWindowText Slow,Win32 C++
EN

Stack Overflow用户
提问于 2013-05-19 02:22:18
回答 3查看 1.8K关注 0票数 4

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

下面是一个代码片段

代码语言:javascript
运行
复制
case 0:
        SetWindowText(GetDlgItem( gHWnd, IDC_PACKETID ), 
                     (LPSTR)std::to_string(long long(NC->mPacketNum)).c_str());
        break;

所以这里发生了很多事情。我只是想把一个数字转换成可以在编辑对话框中显示的东西。这是如此缓慢,我可以从50赫兹下降到大约30赫兹,只要进入这一部分。

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

EN

回答 3

Stack Overflow用户

发布于 2013-05-19 03:00:16

我已经通过维护上一次窗口更新的时间戳来解决这类问题。然后,我会阻止另一次更新,除非经过了一定的时间。十分之一秒的时间对我来说似乎相当不错。性能明显提高,更新看起来仍然很顺利。

票数 2
EN

Stack Overflow用户

发布于 2013-05-19 03:15:56

这段代码中有相当多的内容。

SetWindowText本身似乎不太可能是速度较慢的部分。让我们一块一块地把它拆开,看看时间会往哪里去。(确定的唯一方法是分析,但我不能为您这样做,所以我正在寻找可能性。这取决于您的衡量。)

代码语言:javascript
运行
复制
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的频率改变它,你似乎不太可能需要一个功能齐全的编辑控件。您可以使用静态文本控件来代替吗?它可能有一个更简单更快的implementation.
  4. Is NC->mPacketNum将在很长一段时间内正确对齐?如果不对齐,这可能会对性能产生不利影响。看看你是否能保证对齐。
票数 2
EN

Stack Overflow用户

发布于 2013-05-19 02:23:59

对于高帧率,您将希望使用Direct2D或OpenGL呈现,而不是内置的编辑窗口类。

如果你不需要高帧率,只需要高吞吐量,你可以执行InvalidateRect,只在收到PAINT消息时更改文本。Windows将限制向您发送WM_PAINT的速率。或者使用计时器。这样,您只需将新值存储在内部变量中,并在获得绘图或计时器回调时,将其从interval变量移动到编辑控件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16627530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档