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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Приложение остается в задачах  (Прочитано 5468 раз)
FreeSlave
Гость
« : Декабрь 21, 2011, 18:43 »

Одна из функций, выполняется некоторое время, со специально выставленными задержками в виде
       QTime time;
       time.start();
       for(;time.elapsed() < 400;)
      QApplication::processEvents();

При нажатии на кнопку запускается цикл, в котором помимо прочего вызывается и функция с задержкой. Если закрыть приложение во время выполнения цикла, оно будет продолжать висеть в диспетчере. Как исправить?
Записан
BRE
Гость
« Ответ #1 : Декабрь 21, 2011, 19:07 »

Как исправить?
Улыбающийся
Ну перед закрытием завершать этот цикл.
Записан
FreeSlave
Гость
« Ответ #2 : Декабрь 21, 2011, 19:12 »

Как функция во время выполнения узнает, что пользователь нажал на выход?
Насколько я понял, приложение не освобождается из памяти, потому что processEvents "насильно" запускает обработку событий. Может, есть более красивый способ организовать задержку?
Записан
BRE
Гость
« Ответ #3 : Декабрь 21, 2011, 19:20 »

Может, есть более красивый способ организовать задержку?
А для чего нужна задержка внутри приложения?
Записан
FreeSlave
Гость
« Ответ #4 : Декабрь 21, 2011, 19:35 »

Программа, собирающая кубик Рубика. При запуске сборки каждый поворот совершается через определенное количество времени, чтобы пользователь мог как бы следить за сборкой (как бы - потому что всё равно непонятно). При выполнении сборки, пользователь может переключаться между двумя видами - проекцией и разверткой. Собственно, для этого я оставил обработку событий в цикле тайма.

Опишу более подробно само строение программы.
В main статически создается объект класса, унаследованного от виджета. На нём есть кнопка, по сигналу clicked которой вызывается слот сборки. Там уже вызываются приватные методы класса, представляющие собой этапы сборки, и уже в этих методах вызываются методы поворота, где и стоит задержка.
Записан
BRE
Гость
« Ответ #5 : Декабрь 21, 2011, 19:48 »

IMHO, здесь лучше не задержку использовать, а таймер (QTimer), по тику которого будет происходить поворот кубика (следующий тик).
Записан
FreeSlave
Гость
« Ответ #6 : Декабрь 21, 2011, 20:28 »

Пока не совсем понял, как реализовать задержку с помощью QTimer. Читал М.Шлее - у него ничего внятного по этому поводу нет. Не подскажете?
Записан
BRE
Гость
« Ответ #7 : Декабрь 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()
{
   // каждый тик
   вычислили что и куда нужно повернуть;
   показали поворот;
}
 
Записан
FreeSlave
Гость
« Ответ #8 : Декабрь 21, 2011, 21:05 »

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

Нужна местная задержка.
Это потому, что ты так написал. Улыбающийся
И разные этапы и разные циклы - все это можно свести к одной функции, которая будет рассчитывать и возвращать следующее состояние.

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

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #10 : Декабрь 22, 2011, 16:55 »

а а программу полюбоваться можно?  Улыбающийся
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Ubuntu_linux
Гость
« Ответ #11 : Декабрь 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
.........
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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