Актуализирайте QGraphicsScene от друга, неосновна нишка

Аз съм доста нов в рамката за графичен изглед на QT и не можах да намеря нищо за това в документите или в Google.

Имам GUI приложение, което рисува представяне на някои данни. Самото приложение върши известна работа с матрици/вектори (невронна мрежа) и трябва да го представи на QGraphicsScene. Дотук добре, но забелязах, че приложението segfaults & се срива рано или късно (и обикновено по-рано), ако се опитам да актуализирам QGraphicsScene от друга нишка. Документите на QT не казват нищо за безопасността на нишките и Google не дава нищо. Това, което искам (и почти трябва) да направя, е да изпълня изчисленията и съответно да актуализирам GUI представянето, но самите GUI контроли и т.н. трябва да останат отзивчиви. Както казах, първата ми мисъл беше да направя всичко в друга тема, но тя се срива произволно, ако се опитам.

Има ли някаква „приета практика“ да се правят подобни неща в QT или има нещо, за което не знам в самата рамка за графичен изглед?


person TC1    schedule 09.08.2011    source източник


Отговори (1)


Документите на Qt всъщност казват доста много за безопасността на нишки. Ако документите за QGraphicsScene не казват нищо, това е защото те не са безопасни за нишки, в съответствие с поведението, което виждате.

Това, което трябва да направите, е да изпълните вашите изчисления в друга нишка и да синхронизирате тази нишка с основната GUI нишка, както е подходящо. Лесен начин да направите това е да зададете флаг в главната нишка, когато изчисленията са готови за показване. По този начин можете да извикате подходящите QGraphicsScene методи в главната нишка в точното време, като просто проверите флага.

person Troubadour    schedule 09.08.2011
comment
О, не знаех, че QT документите са по този начин, съжалявам. Kindof свикна с javadocs, обикновено го посочваха изрично. Както и да е, тогава знаете ли начин за това? - person TC1; 09.08.2011
comment
Актуализирах отговора си. Трябва да синхронизирате двете нишки. Начинът, по който го правите сега, може да извиквате метод QGraphicsScene в една нишка, докато същият екземпляр QGraphicsScene е в средата на изпълнение на същия или друг от своите методи в другата нишка. Помислете за възможната касапница! - person Troubadour; 09.08.2011