【发布时间】: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..
【问题讨论】:
-
@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