Russian Qt Forum

Qt => Общие вопросы => Тема начата: FreeSlave от Декабрь 21, 2011, 18:43



Название: Приложение остается в задачах
Отправлено: FreeSlave от Декабрь 21, 2011, 18:43
Одна из функций, выполняется некоторое время, со специально выставленными задержками в виде
       QTime time;
       time.start();
       for(;time.elapsed() < 400;)
      QApplication::processEvents();

При нажатии на кнопку запускается цикл, в котором помимо прочего вызывается и функция с задержкой. Если закрыть приложение во время выполнения цикла, оно будет продолжать висеть в диспетчере. Как исправить?


Название: Re: Приложение остается в задачах
Отправлено: BRE от Декабрь 21, 2011, 19:07
Как исправить?
:)
Ну перед закрытием завершать этот цикл.


Название: Re: Приложение остается в задачах
Отправлено: FreeSlave от Декабрь 21, 2011, 19:12
Как функция во время выполнения узнает, что пользователь нажал на выход?
Насколько я понял, приложение не освобождается из памяти, потому что processEvents "насильно" запускает обработку событий. Может, есть более красивый способ организовать задержку?


Название: Re: Приложение остается в задачах
Отправлено: BRE от Декабрь 21, 2011, 19:20
Может, есть более красивый способ организовать задержку?
А для чего нужна задержка внутри приложения?


Название: Re: Приложение остается в задачах
Отправлено: FreeSlave от Декабрь 21, 2011, 19:35
Программа, собирающая кубик Рубика. При запуске сборки каждый поворот совершается через определенное количество времени, чтобы пользователь мог как бы следить за сборкой (как бы - потому что всё равно непонятно). При выполнении сборки, пользователь может переключаться между двумя видами - проекцией и разверткой. Собственно, для этого я оставил обработку событий в цикле тайма.

Опишу более подробно само строение программы.
В main статически создается объект класса, унаследованного от виджета. На нём есть кнопка, по сигналу clicked которой вызывается слот сборки. Там уже вызываются приватные методы класса, представляющие собой этапы сборки, и уже в этих методах вызываются методы поворота, где и стоит задержка.


Название: Re: Приложение остается в задачах
Отправлено: BRE от Декабрь 21, 2011, 19:48
IMHO, здесь лучше не задержку использовать, а таймер (QTimer), по тику которого будет происходить поворот кубика (следующий тик).


Название: Re: Приложение остается в задачах
Отправлено: FreeSlave от Декабрь 21, 2011, 20:28
Пока не совсем понял, как реализовать задержку с помощью QTimer. Читал М.Шлее - у него ничего внятного по этому поводу нет. Не подскажете?


Название: Re: Приложение остается в задачах
Отправлено: BRE от Декабрь 21, 2011, 20:48
Пока не совсем понял, как реализовать задержку с помощью QTimer. Читал М.Шлее - у него ничего внятного по этому поводу нет. Не подскажете?
Как это происходит сейчас (как я понял):
Код
C++ (Qt)
for(;;)
{
   // каждый тик
   вычислили что и куда нужно повернуть;
   показали поворот;
   задержка;
}
 

сделать слот, который будет вызываться по таймеру через заданные интервалы времени:
Код
C++ (Qt)
QTimer *timer = new QTimer( ... );
connect( timer, SIGNAL( timeout() ), box, SLOT( nextState() ) );
timer->start( 2000 );    // таймер будет срабатывать раз в 2 сек
 
....
 
void Box::nextState()
{
   // каждый тик
   вычислили что и куда нужно повернуть;
   показали поворот;
}
 


Название: Re: Приложение остается в задачах
Отправлено: FreeSlave от Декабрь 21, 2011, 21:05
Головоломка собирается в несколько этапов, для каждого своя функция (свой цикл), то есть вычисления нужных поворотов не единообразны. При этом в одной итерации цикла в каждой функции может содержаться по несколько поворотов. Поэтому написать, как вы предложили, не получится. Насколько я понял, в данном случае QTimer сам как бы выступает в качестве цикла, но здесь это совсем не подходит. Нужна местная задержка.


Название: Re: Приложение остается в задачах
Отправлено: BRE от Декабрь 21, 2011, 21:58
Нужна местная задержка.
Это потому, что ты так написал. :)
И разные этапы и разные циклы - все это можно свести к одной функции, которая будет рассчитывать и возвращать следующее состояние.

Ну как вариант, вынести задержку в отдельную функции и завести переменную, которую проверять в цикле ожидания. При выходе из программы - эту переменную устанавливать/сбрасывать, цикл будет завершаться и программа останавливаться.


Название: Re: Приложение остается в задачах
Отправлено: panAlexey от Декабрь 22, 2011, 16:55
а а программу полюбоваться можно?  :)


Название: Re: Приложение остается в задачах
Отправлено: Ubuntu_linux от Декабрь 22, 2011, 20:51
В Qt обично задержку делают так:

Код
C++ (Qt)
............
QEentLoop loop;
QTimer timer;
connect(&timer,SIGNAL(timeOut()),&loop,SLOT(quit()));
timer.start(1000);
loop.exec(); /// wait 1 sec before next step
.........