crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> остаток времени в QTime
SABROG
  опции профиля:
сообщение 15.6.2009, 15:44
Сообщение #21


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Таймер и другой поток необходимы в ситуации, когда по таймауту вызываются "долгоиграющие" методы, которые блокируют цикл сообщений и соответственно подвешивают GUI. Как вариант можно по таймауту запускать существующий поток на выполнение, после того как он сделает своё черное дело усыплять его. Естественно при такой схеме таймер будет существовать в основном потоке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.6.2009, 15:57
Сообщение #22


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Задается определенное время, например 15 минут или 2 часа и запускается поток работы прожектора (прожектор начинает вращаться в 2 плоскостях - вертикальной и горизонтальной) - чтобы приложение в этот момент не висело, то вынесено в отдельный поток (заодно идет обучение правильной работы с доп. потоком). При этом запускаются часы, которые показывают оставшееся время работы прожектора.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.6.2009, 17:44
Сообщение #23


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

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

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




Репутация:   29  


Цитата(AD @ 15.6.2009, 16:17) *
Такую ситуацию сам Qtime отследит:
Еще раз говорю, что не отследит.
    QTime finished_time(0,0,0);
    int secs = QTime::currentTime().secsTo(finished_time);
    qDebug() << secs;
Цитата
warning: -66787

Т.е. если ты включил свой прожектор в один день, например, в 23.00, а выключить надо в 00.15 уже другого дня, ты получишь отрицательное время.

Цитата(AD)
заодно идет обучение правильной работы с доп. потоком
Прежде чем работать с потоками, нужно разобраться со способами синхронизации потоков.

Сообщение отредактировал igor_bogomolov - 15.6.2009, 17:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.6.2009, 18:29
Сообщение #24


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(igor_bogomolov @ 15.6.2009, 18:44) *
Цитата(AD)
заодно идет обучение правильной работы с доп. потоком
Прежде чем работать с потоками, нужно разобраться со способами синхронизации потоков.

Вот именно с этим и разбираюсь на практике. Можно как-то не так нравоучительно! ;) Ну честное слово, все-таки не школяр какой-то.... :)

что-то я даже подзапутался. Мне необходимо, чтобы определенное действие происходило 1 раз в минуту в течение заданного времени. Как это сделать? Еще один таймер заводить и запускать его уже в доп. потоке?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 15.6.2009, 20:50
Сообщение #25


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

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

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




Репутация:   23  


Цитата(AD @ 15.6.2009, 19:29) *
Мне необходимо, чтобы определенное действие происходило 1 раз в минуту в течение заданного времени.

ну если раз в минуту то могу предложить
стартовать таймер в программе предположим каждые 10 секунд завести член класса QTime time наращивать его в timerEvent`e на десять секунд. при достижении определенного времени останавливать таймер сбрасывать время. как то так.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.6.2009, 22:43
Сообщение #26


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

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

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




Репутация:   29  


Цитата(AD @ 15.6.2009, 19:29) *
Мне необходимо, чтобы определенное действие происходило 1 раз в минуту в течение заданного времени. Как это сделать? Еще один таймер заводить и запускать его уже в доп. потоке?
Тут столько разных реализаций придумать можно. Несколько у тебя уже есть.

void ContinueRotation::run()
{
    const int pause = 1000 * 60;
    QDateTime startDT = QDateTime::currentDateTime();

    while(finish_datatime >= startDT) {
        msleep(pause);
        startDT = QDateTime::currentDateTime();
        //emit - эмитируем сигнал с периодом "pause".
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 16.6.2009, 8:44
Сообщение #27


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(igor_bogomolov @ 15.6.2009, 23:43) *
        //emit - эмитируем сигнал с периодом "pause".

А как это сделать? Разность опять рассчитывать или же в самом emit что-то сделать?

Сообщение отредактировал AD - 16.6.2009, 8:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.6.2009, 8:55
Сообщение #28


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(AD @ 16.6.2009, 12:44) *
или же в самом emit что-то сделать?
а что ты в нём можешь сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 16.6.2009, 9:56
Сообщение #29


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


вызвать сигнал, который ассоциирую со слотом, выполняющим нужные мне вращения прожектора.


igor_bogomolov, прости, но я в упор не понимаю, чем плохо то, что получилось отрицательное число?
вот я задал такой код:
QTime p(0, 0, 25, 100);
int secs = QTime::currentTime().secsTo(p);
QTime t;    t = t.addSecs(secs);

В Петербурге сейчас 10:50 (округленно). Он мне и посчитал, что до окончания работы должно пройти 13 часов 10 минут. Ведь правильно? В чем проблемы? Т.е. в t занеслось вполне корректное время. Функция addSecs умеет обрабатывать заданные промежутки. Где может поломаться-то?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 16.6.2009, 11:03
Сообщение #30


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

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

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




Репутация:   29  


Цитата(Игорь)
А я вот совершенно не уверен (по тому коду, что сейчас есть). Что произойдет, когда int secs станет отрицательным. t = t.addSecs(secs) останется инициализированным нулями? Я не проверял такого поведения.
Т.е. я не говорил, что это плохо, а только то что, не знаю как данный код отработает. Теперь буду знать, что addSecs может принимать отрицательное значение, и коректно его отрабатывать.


Тагда остается проблемма если твой прожектор должен крутиться больше суток :)
Если конечно такое возможно

Сообщение отредактировал igor_bogomolov - 16.6.2009, 11:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 2:30