QGraphics * 클래스가 스레드로부터 안전하지 않다고 생각합니까? 나는 오래된 애플 리케이션을 Qt에 포팅하고 있으며, 다중 스레드로 만들려고 시도하고있다. 나는 업데이트 코드를 보았고 아무런 잠금이없는 것을 본다.QGraphicsView/Scene - 멀티 스레드 악몽
필자가 시작한 모든 작업은 GUI가 차단할 필요가 없도록 일련의 작업자 스레드로 수행됩니다. 그러나 시각적 표현을 표시하자마자 업데이트 코드가 다른 스레드가 쓰고있는 버퍼에서 읽으려고 시도 할 때 모든 것이 한 묶음의 카드처럼 떨어집니다.
- 는 타원의 무리
- 이 장면에서 모든 개체에 어떤 설정을 수정 스레드를 만들고 루프에서 그것을 장면 포인터
- 을 통과 개체 만들기 :
여기 내 테스트 케이스이다.
테스트 기능 : 나는이 문제를 해결할 수있는 방법에 대해 생각되었다
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;
}
그리고 그들 중 누구도 특히 꽤 있습니다.
내가 원하는 것은 이상적으로 다음 렌더링 호출까지 버퍼링되는 객체의 설정을 변경하는 것이지만, 당분간은 충돌하지 않고 해결할 것입니다.
더블 록 스텝 두 장면 그래프 (한 렌더링 한 업데이트)를 유지하는 전체 장면을 버퍼 : 순간
나는 네 가지 옵션이 있습니다. 이것이 멀티 스레드 게임 엔진의 작동 방식입니다. 이것은 CPU 시간을 두 배로 늘리고 메모리를 두 배로 늘리므로 끔찍한 일입니다. 두 장면 그래프를 유지 관리하는 데 필요한 물류는 말할 것도 없습니다.위와 같이 QGraphics *를 스레드로부터 안전하게 수정하십시오. 이것은 아마도 가장 실용적인 접근 방법 일 것입니다. 그러나 그것을 끝내기 위해서는 많은 노력이 필요합니다.
장면을 대기열로 밀어 넣고 주 스레드에서 처리합니다.
당분간 바람에 멀티 쓰레딩을 던져서 문서가 업데이트 될 때 내 앱이 멈추게하십시오. (일부 문서의 경우 데이터 크기가 충분하지 않음)
특히 매력적이며 많은 작업이 필요합니다.
아무도 아이디어를 가지고 있지 않거나 QGraphicsScene을 멀티 스레딩하기 전에 시도한 적이 있습니까?
건배
아쉽게도 구성 요소를 설정하는 데 상당한 시간이 걸릴 수 있습니다 (단, 해당 단계로 이동하는 데 필요한 처리 시간은 아님). 렌더링 된 문서의 특성을 감안할 때 나는 QGraphicsScene을 데이터로, QGraphicsView를 GUI로 취급하고 있습니다. 바르게 지적했듯이, 변경 사항을 메인 Qt 브랜치와 병합하는 것이 주요한 악몽 일 것입니다. 또한, 업데이트 코드에는 잠금 장치를 넣는 것이 중요하지 않은 많은 입구가 있습니다. – icStatic