【问题标题】:Fast changing QLineEdit crashing the application快速变化的 QLineEdit 使应用程序崩溃
【发布时间】:2010-08-25 23:33:30
【问题描述】:

我有三个 QLineEdit 字段,其内容变化非常快(100/秒)。 不知何故,它使应用程序崩溃。也许这是一个错误或我犯了一个错误。

这里有一些代码:

acc[0]->setText(QString("%1").arg(acceleration.x));
acc[1]->setText(QString("%1").arg(acceleration.y));
acc[2]->setText(QString("%1").arg(acceleration.z));

调用栈:http://pastebin.com/RmkZHTjk

有时我会收到此错误:

0x6518cbb3 处未处理的异常 (QtGuid4.dll) 在 Test.exe: 0xC0000005: 访问冲突读取位置 0x0000002c.

为此调用堆栈:http://pastebin.com/c1u53a0Z

我用 QLabel 试过了,然后又报错:

在 0x751a9617 处未处理的异常 Test.exe:Microsoft C++ 异常: 内存位置的 std::bad_alloc 0x03aeea70..

调用栈:http://pastebin.com/G4yeiW2Y

【问题讨论】:

  • @Roland Soós:您是否尝试对代码进行一些更改?例如,setText() 仅带有一个 QLineEdit,还是使用 QLabel 代替 QLineEdit?有意思,结果会怎样……真的有必要以这种速度打印加速度值吗?
  • 您是否尝试过以较慢的速度使用回溯中的字符串(或仅单行编辑?)?另外,回溯多长时间?有时堆栈溢出会导致 Qt 中的深处崩溃,人们会摸不着头脑,直到他注意到堆栈的大小。
  • 是的,我用 QLabel 试过了,然后又遇到了一些错误。我已将此信息添加到问题中。我试图将其限制为 10change/sec。它在 6% 的处理器使用率上运行良好。在 100change/sec 上,处理器使用率为 50%(我有 2 个核心)。
  • @Roland Soós:在我看来,您从非 UI 线程调用 setText()。那不行,QWidgets 不是线程安全的。
  • 如果您从主线程(UI 线程)以外的地方调用 setText,您只需将该操作移至主线程即可。向您的主窗口(标签所在的位置)添加一个槽函数,并从其他线程发送一个带有加速度值的信号作为参数。

标签: visual-studio-2008 visual-c++ qt


【解决方案1】:

让我们关闭它。这是弗兰克一周前作为评论发布的答案。

@Roland Soós:在我看来,您从非 UI 线程调用 setText()。那是行不通的,QWidgets 不是线程安全的。 -- 弗兰克

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多