2014-02-18 5 views
2

В настоящий момент я действительно запутался в потоковом в QT. Я читал разные мнения, которые я могу понять.Обновление QT Graphicview из другой темы

У меня есть класс (вычисления), который выполняет тяжелые вычисления и генерирует много решений. Когда этот класс найдет решение, позвоните по телефону

boost::function<void (Solution)> f; 

пользовательская функция. Который может быть связыванием с

f = boost::bind(&MainWindow::FoundSolution, this,_1); 

Нет, у меня есть мой главный выключатель в QT. Там я называю мой класс вычисления с

Computations comp(f); 
QFuture<void> future = QtConcurrent::run(comp,&Computations::DoSomethink); 

Так что вычислить в то время как я могу использовать графический интерфейс и я получаю ответ новых решений для функции FoundSolution в моем главном окне. В этой функции я использую QGraphicview для вывода моего решения. Qgraphicsview является членом моего Mainwindow.

Это работает иногда.

Но я часто получаю следующую ошибку

недостаточность Утверждай в QCoreApplication :: SendEvent: «. Не может передавать события объекты owend другим потоком Текущая нить 438bc40 приемник » (типа «QGraphicsScene) был создан в потоке 15dcc00, файл ядра \ qcoreapllication линии 494

Это означает, что я называю мой GUI приложение из потока, который не является основным и это запрещено QT. Но с моей повышающего затруднительное я должен быть в моем главном нить или? И почему это работает иногда?

Знаете ли вы, что лучше для этого? Я действительно новичок в QT и потоках.

Благодарим за помощь.

+1

Вам необходимо использовать сигналы и слоты для обновления, чтобы он выполнялся в потоке основного окна. То, что я имею в виду, это излучать сигналы от рабочего потока. Подключите эти сигналы к слотам на ваших объектах графического интерфейса, которые существуют в основном потоке. – drescherjm

+0

проблема в том, что мой рабочий поток реализуется с QTConcurrent и там у меня нет сигналов или? И моя рабочая нить без каких-либо приложений Qt, поэтому я не могу реализовать сигналы там. Потому что я пробовал путь с boost bind и функцией. – Hunk

+1

Вы можете использовать шаблон Observer для прослушивания рабочего потока и испускать сигналы от Observer, который в этом случае будет QObject. – nbilal

ответ

0

Обычный способ сделать это - использовать сигналы и слоты. Вы можете найти документацию, которая относится к вашей проблеме, здесь: Qt 4.8, Qt 5.

2

Если вы излучаете сигнал от рабочего потока, который подключен к слоту объекта, который живет в нити ui, слот будет выполнен в потоке ui.

Итак, в принципе, если вы хотите нарисовать новую точку в QGraphicsView, отправьте сигнал от вашего рабочего потока, проходящего в координатах новой точки для рисования. Сигнал должен быть подключен к объекту, который живет в потоке ui. Затем слот обработает рисование новой точки в QGraphicsView, которая будет работать, поскольку слот выполняется в потоке ui.

Для получения дополнительной информации см Signals and Slots Across Threads

+0

И как я могу сделать то же самое, и события будут получены ... но в моем случае я выводим информацию в TextBox. Текст не появляется до тех пор, пока поток не будет закрыт, но весь текст будет получен ... поэтому он будет обновлен в конце !. Связано ли это с этим? – darkgaze

0
connect(&sender, SIGNAL(), &receiver, SLOT(), Qt::QueuedConnection) 

Чем проще исправить это добавить Qt :: QueuedConnection к проблемному вызову слот.

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