【问题标题】:QTableWidget consumes CPUQTableWidget 消耗 CPU
【发布时间】:2021-06-20 21:22:06
【问题描述】:

我正在使用 C++ 开发数据包嗅探器,使用 QT 作为用户界面。

我有两个主线程:QT 的主线程,另一个负责抓包和处理的线程。

捕获线程捕获并处理数据包 -> 然后将结果发送到 GUI 线程,由 GUI 线程使用信号和插槽机制显示它。

我正在使用 QTableWidget 来显示数据包。

问题是当我有大量的数据包流时(例如下载某些东西时)程序开始滞后并且程序开始消耗大量 CPU(在下载或视频期间高达 17%)

是否有优化 QTableWidget 并使我的程序更流畅的解决方案?

我的 QTableWidget:

【问题讨论】:

    标签: c++ performance qt qtablewidget packet-capture


    【解决方案1】:

    您最好的选择可能是停止使用 QTableWidget 并改用QTableView。 QTableWidget 和QTableView 的区别在于,QTableWidget 动态分配一个单独的QTableWidgetItem 对象来保存每个单元格的状态;如果您在短时间内创建和/或删除大量单元格(看起来确实如此),则创建和/或删除所有这些对象的效率可能非常低。

    另一方面,QTableView 不需要为每个单元创建任何 QTableWidgetItem 对象,这使得它在负载较重时更加高效。相反,QTableView 必须咨询模型对象,模型对象告诉 QTableView 在任何给定时刻要显示什么数据。您需要创建自己的 QAbstractTableModel 子类供您的 QTableView 参考,并使用指向模型对象的指针在 QTableView 对象上调用 setModel()。

    这有点复杂,所以在尝试实现自己的之前,您需要通读 Qt 的 documentation 并查看他们的 example-programs。

    我已经使用这种方法来实现,例如一个日志视图,有时每秒会生成数十到数百条日志消息,一旦您正确设置模型,它就可以正常工作。

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 2015-05-18
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多