Я использую QWebFrame визуализировать некоторые данные, и я использую evalueateJavascript метод для обновления данных на JavaScript. Вот моя функция для этого.QT сбой приложения при вызове метода evaluatingJavascript QWebFrame назвал
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, так и с потоками, но результаты одинаковы.
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 вызывается из отдельного потока. Вот важные строки из файла coredump, просматриваемого с gdb.
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
Любая помощь для решения этой проблемы действительно оценивается. Благодарю.
Он также может использовать ['QMetaObject :: invokeMethod()'] (https://doc.qt.io/qt-5/qmetaobject.html#invokeMethod) с помощью ['Qt :: QueuedConnection'] (https: //doc.qt.io/qt-5/qt.html#ConnectionType-enum) тип подключения –
Спасибо за помощь. Он решил проблему. – Dinesh
@ Dinesh, можете ли вы отметить это как ответ в этом случае? ;) –