Обновите QGraphicsScene из другого неосновного потока - PullRequest
1 голос
/ 09 августа 2011

Я довольно новичок в графической рамке QT, и я не смог найти ничего об этом в документации или в Google.

У меня есть приложение с графическим интерфейсом, которое рисует представление для некоторых данных. Само приложение выполняет некоторую работу с матрицами / векторами (нейронная сеть) и должно представлять это в QGraphicsScene. Пока все хорошо, но я заметил, что приложение рано или поздно вылетает и падает (и обычно раньше), если я пытаюсь обновить QGraphicsScene из другого потока. Документы QT ничего не говорят о безопасности потоков, а Google ничего не дает. То, что я хочу (и в значительной степени нужно) сделать, это выполнить вычисления и соответствующим образом обновить представление GUI, но элементы управления GUI и т. Д. Сами должны оставаться отзывчивыми. Как я уже сказал, моей первой мыслью было сделать все это в другом потоке, но он случайно зависает, если я попытаюсь.

Есть ли какая-либо "принятая практика", чтобы делать подобные вещи в QT, или есть какие-то хитрости, о которых я не знаю в самой среде графического представления?

1 Ответ

2 голосов
/ 09 августа 2011

Документы Qt на самом деле говорят о безопасности потоков .Если документы для QGraphicsScene ничего не говорят, то это потому, что они не являются поточно-ориентированными, что соответствует наблюдаемому вами поведению.

Что вам нужно сделать, это запустить ваши вычисления в другом потоке и синхронизировать ихпоток с основным потоком графического интерфейса в зависимости от ситуации.Простой способ сделать это - установить флаг в главном потоке, когда вычисления будут готовы к отображению.Таким образом, вы можете вызвать соответствующие методы QGraphicsScene в главном потоке в нужное время, просто установив флажок.

...