gpt4 book ai didi

multithreading - 当QWebFrame的EvaluationJavascript方法调用时,QT应用程序崩溃

转载 作者:行者123 更新时间:2023-12-03 12:59:55 24 4
gpt4 key购买 nike

我正在使用 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结合使用以达到相同的结果。

关于multithreading - 当QWebFrame的EvaluationJavascript方法调用时,QT应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35395845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com