В настоящий момент я действительно запутался в потоковом в 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 и потоках.
Благодарим за помощь.
Вам необходимо использовать сигналы и слоты для обновления, чтобы он выполнялся в потоке основного окна. То, что я имею в виду, это излучать сигналы от рабочего потока. Подключите эти сигналы к слотам на ваших объектах графического интерфейса, которые существуют в основном потоке. – drescherjm
проблема в том, что мой рабочий поток реализуется с QTConcurrent и там у меня нет сигналов или? И моя рабочая нить без каких-либо приложений Qt, поэтому я не могу реализовать сигналы там. Потому что я пробовал путь с boost bind и функцией. – Hunk
Вы можете использовать шаблон Observer для прослушивания рабочего потока и испускать сигналы от Observer, который в этом случае будет QObject. – nbilal