【问题标题】:QT application crashes when QWebFrame's evaluatingJavascript method called调用 QWebFrame 的评估 JavaScript 方法时,QT 应用程序崩溃
【发布时间】:2016-02-14 19:01:47
【问题描述】:

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

非常感谢任何解决此问题的帮助。谢谢。

【问题讨论】:

    标签: multithreading qt boost qthread qtwebkit


    【解决方案1】:

    QWebFrame 函数既不是可重入的,也不是线程安全的。它们只能从主 GUI 线程调用。 Qt 允许您非常轻松地将消息传递到另一个线程。将setValue 函数设为槽,并将其连接到处理线程发出的信号。

    编辑:正如 Vladimir Bershov 在下面的评论中建议的那样,也可以使用 QMetaObject::invokeMethod()Qt::QueuedConnection 来达到相同的结果。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多