Правильно ли я считаю, что классы QGraphics * не являются поточно-ориентированными? Я портирую старое приложение на Qt и пытаюсь сделать его многопоточным. Я посмотрел на код обновления и не вижу никаких блокировок.
Я начал правильно, вся моя обработка выполняется в виде набора рабочих потоков, поэтому графический интерфейс не должен блокироваться. Но как только я прихожу, чтобы показать свое визуальное представление, все падает, как колода карт, когда код обновления пытается прочитать из буфера, в который пишет другой поток.
Вот мой тестовый пример:
- Создание группы объектов эллипса
- Создать поток и передать ему указатель на сцену
- В цикле измените любую настройку для любого объекта в сцене.
Функция тестирования:
bool CBasicDocument::Update( float fTimeStep )
{
const QList<QGraphicsItem*> tObjects = items();
for( QList<QGraphicsItem*>::const_iterator tIter = tObjects.constBegin();
tIter != tObjects.constEnd();
++tIter )
{
QGraphicsEllipseItem* pElipse = (QGraphicsEllipseItem*)(*tIter);
if( pElipse )
{
pElipse->setPen( QPen( QColor( (int)(255.0f * sinf( fTimeStep )), (int)(255.0f * cosf( fTimeStep )), (int)(255.0f * sinf( fTimeStep )) ) ) );
}
}
return true;
}
Я думал о том, как я могу это исправить, и ни один из них не особенно хорош.
В идеале я хочу, чтобы я изменил настройку объекта, он буферизировался до следующего вызова рендеринга, но пока я согласен, что он не потерпит крах!
На данный момент у меня есть четыре варианта:
Двойная буферизация всей сцены с сохранением двух графов сцен в одном шаге (один рендеринг, одно обновление). Так работает наш многопоточный игровой движок. Здесь это ужасно, потому что это потребует удвоения процессорного времени и удвоения памяти. Не говоря уже о логистике ведения обоих графов сцен.
Измените QGraphics *, чтобы обеспечить безопасность потоков, как указано выше. Вероятно, это наиболее практичный подход, но для его выполнения потребуется много работы.
Вставить изменения в сцену в очередь и обработать их из основного потока.
Сбросьте многопоточность на время и просто позвольте моему приложению зависнуть при обновлении документа. (Не очень, учитывая размер данных для некоторых документов)
Ни один из них не особенно привлекателен и требует огромного количества работы.
У кого-нибудь есть идеи или попытки многопоточности QGraphicsScene раньше?
Приветствия