我使用 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
非常感谢任何帮助解决这个问题。感谢。
答案 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()
来获得相同的结果。