2016-02-14 1 views
2

Я использую 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 

Любая помощь для решения этой проблемы действительно оценивается. Благодарю.

ответ

2

QWebFrame функции не являются ни реентерабельными, ни потокобезопасными. Они могут быть вызваны только из основного потока графического интерфейса. Qt позволяет вам легко отправлять сообщение в другой поток. Сделать setValue функцию слот и подключить его к сигналу, испускаемому из потока обработки.

EDIT: Как Владимир Бершов предложил в комментарии ниже, можно также использовать QMetaObject::invokeMethod() с Qt::QueuedConnection для достижения того же результата.

+2

Он также может использовать ['QMetaObject :: invokeMethod()'] (https://doc.qt.io/qt-5/qmetaobject.html#invokeMethod) с помощью ['Qt :: QueuedConnection'] (https: //doc.qt.io/qt-5/qt.html#ConnectionType-enum) тип подключения –

+0

Спасибо за помощь. Он решил проблему. – Dinesh

+0

@ Dinesh, можете ли вы отметить это как ответ в этом случае? ;) –

Смежные вопросы