当QWebFrame评估调用JavaScript方法时,QT应用程序崩溃

时间:2016-02-14 19:01:47

标签: multithreading qt boost qthread qtwebkit

我使用 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

非常感谢任何帮助解决这个问题。感谢。

1 个答案:

答案 0 :(得分:2)

#!/bin/bash fswatch --batch-marker=EOF -xn . | while read file event; do if [ $file = "EOF" ]; then echo TRIGGER echo Files: "${list[@]}" list=() else echo $file $event list+=($file) fi done 函数既不是可重入的也不是线程安全的。它们只能从主GUI线程调用。 Qt允许您非常轻松地将消息传递给另一个线程。使QWebFrame函数成为一个插槽,并将其连接到处理线程发出的信号。

编辑:正如Vladimir Bershov在下面的评论中所建议的那样,人们也可以setValue使用QMetaObject::invokeMethod()来获得相同的结果。