当调用 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 来获得相同的结果。