Russian Qt Forum
Сентябрь 24, 2024, 15:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выполнение отложенной операции  (Прочитано 5597 раз)
fuCtor
Гость
« : Июль 24, 2009, 12:07 »

Не получается разрулить такую задачу. Вроде простая.
Есть некоторая операция, в процессе которой допустим допустим необходимо скрыть некоторую панель. Когда эта операция заканчивается, то необходимо вернуть эту панельку.

Очевидным было использовать QTimer. Когда заканчивается действия то выполняется setSingleShot(N). Сигнал таймера связан со слотом, который снова отображает панель.

Если выполняется цепочка действии, то необходимо чтобы панель оставалась скрытой, но получается так что при повторном выполнении операции накапливается несколько срабатываний и они потом все выполняются, либо в процессе цепочки операций происходит мерцание панельки из-за сработавшего таймера.

Вот не разберусь, как перезапустить таймер чтобы не было раннего срабатывания. Либо как переделать алгоритм работы таймера.
Записан
spectre71
Гость
« Ответ #1 : Июль 24, 2009, 12:30 »

Не получается разрулить такую задачу. Вроде простая.
Есть некоторая операция, в процессе которой допустим допустим необходимо скрыть некоторую панель. Когда эта операция заканчивается, то необходимо вернуть эту панельку.
Просто скрываешь панель в нужный момент, и на окончание операции показываешь.
И зачем нужен таймер? Из твоего описания задачи не понятно!
Записан
fuCtor
Гость
« Ответ #2 : Июль 24, 2009, 12:43 »

Операции могут идти очередью, т.е. крутанул я колесиком, и пошло выполнение операций на каждый такт прокрутки (одна операция занимает порядка 100 - 200мс), после каждой операции вызывается processEvents(), чтобы обработать очередь и не вешать GUI, то если допустим будет подряд 5 -6 таких операций, да даже если и меньше, то панелька будет появляться на долю секунду и исчезать т.к. сработает таймер, а такого мерцания не хотелось бы.

Таким образом необходимо чтоб пока идет выполнение этой очереди панелька была скрыта до ее ПОЛНОГО завершения.
Записан
spectre71
Гость
« Ответ #3 : Июль 24, 2009, 12:54 »

Операции могут идти очередью, т.е. крутанул я колесиком, и пошло выполнение операций на каждый такт прокрутки (одна операция занимает порядка 100 - 200мс), после каждой операции вызывается processEvents(), чтобы обработать очередь и не вешать GUI, то если допустим будет подряд 5 -6 таких операций, да даже если и меньше, то панелька будет появляться на долю секунду и исчезать т.к. сработает таймер, а такого мерцания не хотелось бы.

Таким образом необходимо чтоб пока идет выполнение этой очереди панелька была скрыта до ее ПОЛНОГО завершения.
Для этого используй механизм типа operationBegin() , operationEnd()

Код
C++ (Qt)
int OperationCounter = 0;
 
void operationBegin(void) {
 if(!OperationCounter) {firstOperation();}
 ++OperationCounter;
}
 
void operationEnd(void) {
 --OperationCounter;
 if(OperationCounter) {return;}
 lastOperation();
}
 
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Июль 24, 2009, 12:58 »

после окончания операции запускай второй таймер с таймаутом, скажем 500 мс. В слоте этого таймера показывай панель. Начало следующей операции этот таймер останавливает. Таким образом, если в очереди 5 событий, то панель покажется только в самом конце, после самого последнего события.
Записан
kwisp
Гость
« Ответ #5 : Июль 25, 2009, 11:53 »

вызывается processEvents(), чтобы обработать очередь и не вешать GUI,

может воспользоваться QEventLoop::ProcessEventsFlag
допустим между длительными операциями вызывать processEvents исключая события пользователя(если это возможно и они не нужны), а перед первым выполнением поместить в очередь какое нить событие пользователя, оно будет откладываться после выполнения длительных операций до завершения последней и выхода в основной цикл обработки событий
Улыбающийся
Записан
fuCtor
Гость
« Ответ #6 : Июль 27, 2009, 10:43 »

Решил такой схемой:
Код
C++ (Qt)
timer.blockSignals(true);
timer.stop();
/* действия */
timer.start();
timer.blockSignals(false);
 

И к сигналу уже привязан слот который востанавливает состояние. Вроде работает.
Записан
spectre71
Гость
« Ответ #7 : Июль 27, 2009, 11:04 »

Решил такой схемой:
Код
C++ (Qt)
timer.blockSignals(true);
timer.stop();
/* действия */
timer.start();
timer.blockSignals(false);
 

И к сигналу уже привязан слот который востанавливает состояние. Вроде работает.

Какой смысл делать timer.blockSignals, если ты их уберешь, ничего не изменится.
Записан
fuCtor
Гость
« Ответ #8 : Июль 27, 2009, 14:31 »

внутри "Действий" в циклах и тд и тп стоят processEvents(), а действия могут продлиться дольше чем задержка таймера.
Записан
spectre71
Гость
« Ответ #9 : Июль 27, 2009, 15:13 »

внутри "Действий" в циклах и тд и тп стоят processEvents(), а действия могут продлиться дольше чем задержка таймера.
Ну и что?
timer.blockSignals(true); - соответственно сигналы от timer болльше не генерятся
timer.stop(); -  timer больше не работает  соответственно сигналы от timer болльше не генерятся
Зачем timer.blockSignals(true); Непонимающий
Записан
fuCtor
Гость
« Ответ #10 : Июль 28, 2009, 07:08 »

А вдруг шальной какой ))))
Перестарался с блокировками ), перепишу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.107 секунд. Запросов: 23.