На първо място Qt и почти всяка друга рамка (най-накрая тези, които познавам), която се занимава с елементи на потребителския интерфейс, имат много специфични изисквания за поддръжка на много нишки.
Qt се нуждае от всеки QObject
наследник (като QWidget
), за да бъде присвоен на нишка (вижте QObject::thread()).
Това свойство се присвоява автоматично при създаване на обект към нишката, в която се създава обектът.
Проблемът с това е, че Qt също изисква приспособлението да получава събития само ако принадлежи към същата нишка, където се изпълнява цикълът на събитията (и е правилно добавено към родителския уиджет).
Ако създавате своята огромна джаджа в някаква различна нишка, тя няма да получава събития, докато не бъде преместена в нишката с цикъла на събитията и повторно родителска.
Можете да преместите QWidget
в друга нишка, като извикате QObject::moveToThread() метод. Да предположим, че mParent
е вашето QMainWindow
и mMyWidget
е вашата огромна джаджа:
mMyWidget->setParent(0);
mMyWidget->moveToThread(mParent->thread());
mMyWidget->setParent(mParent); // change this to match your layout requirements.
Проверете QWidget::setParent() за повече информация.
Създаването на вашата огромна джаджа не трябва да се извършва в същата нишка като основната ви нишка. Това е оставено като упражнение, тъй като е почти ясно и Qt документите са обширни за нишки.
Внимавайте, ако бутонът ви е натиснат, преди да е приключило създаването на джаджата: трябва да синхронизирате достъпа до променливата, за да избегнете недефинирано поведение.
Това е поглед на проблема на много високо ниво, но е начало и тъй като не предоставихте никакъв код, давам ви минимум ;D
Друг вариант (и вероятно по-добър) е да погледнете защо създаването на вашата джаджа отнема толкова много време, но без повече информация не мога да помогна.
person
Vinícius Gobbo A. de Oliveira
schedule
27.07.2014