当调用 QWebFrame 的 evaluatingJavascript 方法时,QT 应用程序崩溃
QT application crashes when QWebFrame's evaluatingJavascript method called
我正在使用 QWebFrame 来可视化一些数据,我使用 evalueateJavascript 方法来更新 Javascript。这是我执行此操作的功能。
QWebFrame * webFrame;
void setValue(int idx, double value){
webPage->page()->mainFrame()->evaluateJavaScript(QString("setDataValue(%1,%2)").arg(QString::number(idx)).arg(QString::number(value)));
}
在 QT 应用程序中,我可以通过按钮回调多次调用此函数而不会导致错误。
我想从一个单独的线程调用此 setValue 函数以可视化传入数据。当我从 单独的线程 调用 setValue 函数时,在几次或第一次迭代后 应用程序崩溃 。我尝试了 QThread 和 boost 线程,但结果是一样的。
void dummyTest(){
for(int i = 0; i < 1000; i++)
setValue(0,rand() % 150);
}
此 dummyTest 函数在通过按钮回调调用时也可以正常工作,但 在单独的线程 运行 上崩溃 。
这里是线程初始化的代码
void startSerialProcessing() {
boost::thread_attributes attr;
attr.set_stack_size(1024);
std::cout << "dummy processor started. \n";
serialThread= new boost::thread(&MavLinkAL::dummyTest, this);
}
我的观察是只有在从单独的线程调用 setValue 时才会发生此崩溃。这是从 gdb 查看的 coredump 文件中的重要行。
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00007f3f0d6f361f in WTF::StringImpl::~StringImpl() ()
from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
#1 0x00007f3f0d6583f8 in JSC::JSValue::toStringSlowCase(JSC::ExecState*) const
() from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
#2 0x00007f3f0d68a396 in ?? () from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
#3 0x00007f3f0d55a9f1 in ?? () from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
#4 0x00007f3f0d56313f in ?? () from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
非常感谢任何解决此问题的帮助。谢谢
QWebFrame
函数既不是可重入的也不是线程安全的。它们只能从主 GUI 线程调用。 Qt 允许您很容易地向另一个线程传递消息。使 setValue
函数成为槽,并将其连接到从处理线程发出的信号。
编辑:正如 Vladimir Bershov 在下面的评论中所建议的,也可以使用 QMetaObject::invokeMethod()
和 Qt::QueuedConnection
来获得相同的结果。
我正在使用 QWebFrame 来可视化一些数据,我使用 evalueateJavascript 方法来更新 Javascript。这是我执行此操作的功能。
QWebFrame * webFrame;
void setValue(int idx, double value){
webPage->page()->mainFrame()->evaluateJavaScript(QString("setDataValue(%1,%2)").arg(QString::number(idx)).arg(QString::number(value)));
}
在 QT 应用程序中,我可以通过按钮回调多次调用此函数而不会导致错误。
我想从一个单独的线程调用此 setValue 函数以可视化传入数据。当我从 单独的线程 调用 setValue 函数时,在几次或第一次迭代后 应用程序崩溃 。我尝试了 QThread 和 boost 线程,但结果是一样的。
void dummyTest(){
for(int i = 0; i < 1000; i++)
setValue(0,rand() % 150);
}
此 dummyTest 函数在通过按钮回调调用时也可以正常工作,但 在单独的线程 运行 上崩溃 。
这里是线程初始化的代码
void startSerialProcessing() {
boost::thread_attributes attr;
attr.set_stack_size(1024);
std::cout << "dummy processor started. \n";
serialThread= new boost::thread(&MavLinkAL::dummyTest, this);
}
我的观察是只有在从单独的线程调用 setValue 时才会发生此崩溃。这是从 gdb 查看的 coredump 文件中的重要行。
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00007f3f0d6f361f in WTF::StringImpl::~StringImpl() ()
from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
#1 0x00007f3f0d6583f8 in JSC::JSValue::toStringSlowCase(JSC::ExecState*) const
() from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
#2 0x00007f3f0d68a396 in ?? () from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
#3 0x00007f3f0d55a9f1 in ?? () from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
#4 0x00007f3f0d56313f in ?? () from /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4
非常感谢任何解决此问题的帮助。谢谢
QWebFrame
函数既不是可重入的也不是线程安全的。它们只能从主 GUI 线程调用。 Qt 允许您很容易地向另一个线程传递消息。使 setValue
函数成为槽,并将其连接到从处理线程发出的信号。
编辑:正如 Vladimir Bershov 在下面的评论中所建议的,也可以使用 QMetaObject::invokeMethod()
和 Qt::QueuedConnection
来获得相同的结果。