【问题标题】:Qt application interface freezeQt 应用程序界面冻结
【发布时间】:2018-05-04 23:33:48
【问题描述】:

我的嵌入式应用程序遇到了一些问题。它是一个页面,其中包含一个 QTimeEdit 每秒计算时间、一些复选框和一些 QLineEdits 每秒刷新一次。

工作几分钟后,我看到界面冻结,即使应用程序仍在运行。如果尝试按下按钮或复选框,则会出现访问冲突消息:

异常“访问冲突”(14): Thread-Id=05d80002(pth=8af6109c), Proc-Id=04a90002(pprc=91431714) 'nmb3.exe', VM-active=04a90002(pprc=91431714) ' nmb3.exe' PC=407ea307(qtgui4.dll+0x0005a307) RA=40d6c82c(qtgui4.dll+0x005dc82c) SP=01c1b928, BVA=​​00000004

异常与qtgui4.dll 有关。我检查了是否发生虚拟内存饱和,但这不是导致冻结的问题。

如果我避免更新QTimeEdit,则不会发生冻结,但我不明白为什么。

【问题讨论】:

  • 你能分享你的代码吗?
  • 应用程序由线程、主窗口和QWidget组成。线程通过使用信号/槽与 QWidget 进行通信。每秒钟,它都会执行以下操作:time.start(); //QTime emit updateTimeSignal(time); emit updateListOfSensorsSignal(sensorData); //update the different line edit instruments with sensors data
  • 您确定要更新 GUI 线程中的 QTimeEdit,而不是其他线程吗?
  • 是的,我确定。如果我将发射评论到 QTimeEdit,它会停止显示递增时间。同时我没有看到界面冻结。实际上,updateTimeSignal 是由 QtimeEdit 和不同标签组成的 QWidget 的信号
  • 为了能够帮助您,我们需要您的代码来查看您的编码方式。您可能存在访问内存冲突或死锁,但如果我们没有看到您的代码,我们无法弄清楚。

标签: c++ visual-studio qt exception qtgui


【解决方案1】:

您应该将计时器移到主窗口类中,将传感器处理程序保留在单独的线程中。

传感器处理程序应该:

  • 存储数据
  • 向窗口发出“数据就绪”信号

然后主窗口中的计时器每秒将:

  • 从传感器处理程序中读取数据
  • 更新图形用户界面

(确保您使用的是线程安全对象或管理关键部分)

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多