crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Qt 4.x Анимация в отдельном потоке
aukolosov
  опции профиля:
сообщение 8.10.2010, 8:47
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 8.10.2010
Пользователь №: 2095

Спасибо сказали: 0 раз(а)




Репутация:   0  


В программе на Qt 4.7.0 под Red Hat Enterprise Linux 5.5 понадобилось реализовать анимацию (вращающаяся картинка). Анимацию сделал в виде отдельного класса унаследованного от QWidget.
Сама анимация работает. Вот только туплю как затолкать ее в отдельный поток, чтобы она не мешала работе основной программы?

Т.е. как сделать, чтобы объект класса унаследованного от QWidget работал в отдельном потоке?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 8.10.2010, 8:49
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


aukolosov,
по-моему, весь гуи в основном потоке должен быть. - в смысле это одно из требований Qt.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
quarz
  опции профиля:
сообщение 9.10.2010, 13:12
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 3.11.2009
Пользователь №: 1202

Спасибо сказали: 5 раз(а)




Репутация:   0  


aukolosov, сделай анимацию в *.gif и отображай в QLabel с помощью QMovie
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.10.2010, 16:57
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


aukolosov, у класса-виджета сделай метов void Tick();

и тикай его из любого потока с нужным интервалом :)

Цитата(kwisp @ 8.10.2010, 11:49) *
aukolosov,
по-моему, весь гуи в основном потоке должен быть. - в смысле это одно из требований Qt.

что за глупое требование такое... Не верится :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 9.10.2010, 17:45
Сообщение #5


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Алексей1153 @ 9.10.2010, 17:57) *
что за глупое требование такое... Не верится :)
А придется;)
Это на самом деле так. Со всем что унаследовано от QWidget можно работать только в основном потоке. Перемещать виджеты между потоками нельзя, так же как и создавать их вне основного (gui) потока. Если как то нужно управлять виджетом из другого потока (например прогрессбаром), это делается через сигнал-слот взаимодействие (понятно что слот будет вызван в контексте основного (gui) потока).

Поэтому, так как написал Алексей1153 делать нельзя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.10.2010, 18:06
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(igor_bogomolov @ 9.10.2010, 20:45) *
Поэтому, так как написал Алексей1153 делать нельзя.

то есть, достаточно Tick() сделать слотом - и уже можно ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 9.10.2010, 18:07
Сообщение #7


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Алексей1153 @ 9.10.2010, 19:06) *
то есть, достаточно Tick() сделать слотом - и уже можно ?
Почти. Вызывать на прямую, как обычную функцию нельзя. Только через сигнал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.10.2010, 18:55
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


ну я и имел в виду через сигнал

Сообщение отредактировал Алексей1153 - 9.10.2010, 18:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
aukolosov
  опции профиля:
сообщение 21.10.2010, 14:05
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 8.10.2010
Пользователь №: 2095

Спасибо сказали: 0 раз(а)




Репутация:   0  


В общем сделал как посоветовал Алексей1153.

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

Поигрался с несколькими потоками с разными приоритетами - вроде бы работает как должно быть.

Спасибо всем ответившим.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 21.10.2010, 14:11
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(aukolosov @ 21.10.2010, 17:05) *
Поигрался с несколькими потоками

а зачем несколько потоков ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 23:35