Russian Qt Forum

Qt => Общие вопросы => Тема начата: fuCtor от Июль 24, 2009, 12:07



Название: Выполнение отложенной операции
Отправлено: fuCtor от Июль 24, 2009, 12:07
Не получается разрулить такую задачу. Вроде простая.
Есть некоторая операция, в процессе которой допустим допустим необходимо скрыть некоторую панель. Когда эта операция заканчивается, то необходимо вернуть эту панельку.

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

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

Вот не разберусь, как перезапустить таймер чтобы не было раннего срабатывания. Либо как переделать алгоритм работы таймера.


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


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

Таким образом необходимо чтоб пока идет выполнение этой очереди панелька была скрыта до ее ПОЛНОГО завершения.


Название: Re: Выполнение отложенной операции
Отправлено: spectre71 от Июль 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();
}
 


Название: Re: Выполнение отложенной операции
Отправлено: Alex Custov от Июль 24, 2009, 12:58
после окончания операции запускай второй таймер с таймаутом, скажем 500 мс. В слоте этого таймера показывай панель. Начало следующей операции этот таймер останавливает. Таким образом, если в очереди 5 событий, то панель покажется только в самом конце, после самого последнего события.


Название: Re: Выполнение отложенной операции
Отправлено: kwisp от Июль 25, 2009, 11:53
вызывается processEvents(), чтобы обработать очередь и не вешать GUI,

может воспользоваться QEventLoop::ProcessEventsFlag
допустим между длительными операциями вызывать processEvents исключая события пользователя(если это возможно и они не нужны), а перед первым выполнением поместить в очередь какое нить событие пользователя, оно будет откладываться после выполнения длительных операций до завершения последней и выхода в основной цикл обработки событий
:)


Название: Re: Выполнение отложенной операции
Отправлено: fuCtor от Июль 27, 2009, 10:43
Решил такой схемой:
Код
C++ (Qt)
timer.blockSignals(true);
timer.stop();
/* действия */
timer.start();
timer.blockSignals(false);
 

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


Название: Re: Выполнение отложенной операции
Отправлено: spectre71 от Июль 27, 2009, 11:04
Решил такой схемой:
Код
C++ (Qt)
timer.blockSignals(true);
timer.stop();
/* действия */
timer.start();
timer.blockSignals(false);
 

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

Какой смысл делать timer.blockSignals, если ты их уберешь, ничего не изменится.


Название: Re: Выполнение отложенной операции
Отправлено: fuCtor от Июль 27, 2009, 14:31
внутри "Действий" в циклах и тд и тп стоят processEvents(), а действия могут продлиться дольше чем задержка таймера.


Название: Re: Выполнение отложенной операции
Отправлено: spectre71 от Июль 27, 2009, 15:13
внутри "Действий" в циклах и тд и тп стоят processEvents(), а действия могут продлиться дольше чем задержка таймера.
Ну и что?
timer.blockSignals(true); - соответственно сигналы от timer болльше не генерятся
timer.stop(); -  timer больше не работает  соответственно сигналы от timer болльше не генерятся
Зачем timer.blockSignals(true); ???


Название: Re: Выполнение отложенной операции
Отправлено: fuCtor от Июль 28, 2009, 07:08
А вдруг шальной какой ))))
Перестарался с блокировками ), перепишу.