Я разрабатываю приложение, используя Qt для основной логики и Wt для пользовательского интерфейса.
Однако я пришел к проблеме, которую не смог решить. Я применил это к примеру с wtwithqt.
Я только изменил функцию «passGreet», чтобы вызывать сигнал асинхронно, а не напрямую.
Приложение вылетает в этот момент. Я не очень понимаю, почему.
РЕДАКТИРОВАТЬ: На самом деле он действительно падает, когда редактирует объект Wt в "HelloApplication::doGreet(const QString& qname)"
картина: https://dl.dropbox.com/u/90945130/crash.png
Возможно, что-то связано с источником действия, начиная с цикла событий Qt?
Вот код
#include "HelloApplication.h"#include "QtObject.h"
#include <QDebug>
#include <QThread>
QtObject::QtObject(HelloApplication *wt, QObject *parent)
: QObject(parent),
wt_(wt)
{}
void QtObject::passGreet(const QString& name)
{
//Q_EMIT greet(name);
QMetaObject::invokeMethod(this, "greet", Qt::QueuedConnection, Q_ARG(QString, name));
}
void QtObject::doGreet(const QString& name)
{
wt_->doGreet(name);
}
Остальная часть неизмененного кода находится здесь: http://pastebin.com/fih6P2eH
Спасибо за любую помощь заранее!
Здесь вы видите QThread, который обновляет дерево виджетов Wt и не захватывает WApplication :: UpdateLock. Помимо обеспечения эксклюзивного доступа к дереву виджетов, блокировка обновления также устанавливает локальное хранилище некоторого потока, а отсутствующий TLS (WApplication :: instance ()) приводит к сбою приложения.
Требуемый механизм блокировки может быть сложным — проще использовать WServer :: post (), чтобы избежать взаимных блокировок.
Других решений пока нет …