crossplatform.ru

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

> остаток времени в QTime
AD
  опции профиля:
сообщение 11.6.2009, 17:56
Сообщение #1


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

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

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




Репутация:   17  


В какой-то момент стартанули поток, процесс, таймер (не столь важно). Этот момент времени запомнили. Через какие-то промежутки времени берем текущее время. Узнаем разность. Но вопрос в том, как получить оставшееся время?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
4 страниц V  < 1 2 3 4 >  
Начать новую тему
Ответов (10 - 19)
AD
  опции профиля:
сообщение 15.6.2009, 14:26
Сообщение #11


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

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

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




Репутация:   17  


Цитата(kwisp @ 15.6.2009, 14:46) *
была такая проблемка и у меня.
если я правильно понял, то Запомнить время начала это запомнить системное время? так?
я сначала так и сделал, но потом от шефа получил по рукам.
шеф мотивировал тем что если время выполнения большое к примеру более 1 минуты то пользователь сможет поменять системное время и тогда будет ерунда.

наверное самому время надо считать в смысле заводить таймер и наращивать время.

Ты о чем вообще? :)))

Вот решение проблемы, которое предложил SABROG, за что ему огромное спасибо:
/// Запуск потока вращения в обеих плоскостях длительный промежуток времени
void ContinueRotation::run()
{
    while(_time.hour() || _time.minute() || _time.second() || _time.msec())
    {
        int secs = QDateTime::currentDateTime().time().secsTo(finished_time);
        QTime t;    t = t.addSecs(secs);
        int el_t = t.hour() * 60 * 60 * 1000 + t.minute() * 60 * 1000 + t.second() * 1000 + t.msec();
        int _t = _time.hour() * 60 * 60 * 1000 + _time.minute() * 60 * 1000 + _time.second() * 1000 + _time.msec();
        int diff = _t - el_t;
        _time = t;
        if(diff >= 1000) emit timeout(_time);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.6.2009, 14:45
Сообщение #12


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

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

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




Репутация:   29  


Цитата(AD)
/// Запуск потока вращения в обеих плоскостях длительный промежуток времени
void ContinueRotation::run()
{
    while(_time.hour() || _time.minute() || _time.second() || _time.msec())
    {
        int secs = QDateTime::currentDateTime().time().secsTo(finished_time);
        QTime t;    t = t.addSecs(secs);
        int el_t = t.hour() * 60 * 60 * 1000 + t.minute() * 60 * 1000 + t.second() * 1000 + t.msec();
        int _t = _time.hour() * 60 * 60 * 1000 + _time.minute() * 60 * 1000 + _time.second() * 1000 + _time.msec();
        int diff = _t - el_t;
        _time = t;
        if(diff >= 1000) emit timeout(_time);
    }
}


1) Если ты не учитываешь дату, зачем используешь QDateTime, достаточно QTime
int secs = QTime::currentTime().secsTo(finished_time);

2) По идее твой run должен грузить проц на 100%. Дабавь в цикл QThread::msleep.
3) Зачем для токого функционала выделять доп. поток?
4) _time не защищен мьютексом.
5) Уверен ли ты что поток гарантированно завершится по прошествии нужного времени

Сообщение отредактировал igor_bogomolov - 15.6.2009, 14:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 15.6.2009, 14:50
Сообщение #13


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

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

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




Репутация:   23  


AD,
значит я чего-то не допонял.:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.6.2009, 14:56
Сообщение #14


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

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

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




Репутация:   29  


Цитата(kwisp @ 15.6.2009, 15:50) *
значит я чего-то не допонял.
Помоему все правильно ты говоришь. Только такая ситуация моловероятна. Но от дураков защититься можно ;)

Сообщение отредактировал igor_bogomolov - 15.6.2009, 14:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.6.2009, 15:04
Сообщение #15


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

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

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




Репутация:   17  


Цитата(igor_bogomolov @ 15.6.2009, 15:45) *
1) Если ты не учитываешь дату, зачем используешь QDateTime, достаточно QTime
int secs = QTime::currentTime().secsTo(finished_time);

2) По идее твой run должен грузить проц на 100%. Дабавь в цикл QThread::msleep.
3) Зачем для токого функционала выделять доп. поток?
4) _time не защищен мьютексом.
5) Уверен ли ты что поток гарантированно завершится по прошествии нужного времени

1) Да. Поправил. Бывает.... Спасибо.
2) Куда и как добавить? Подскажи, пожалуйста.
3) Доп. поток, потому что это только начало работы потока. Там более сложная структура.
4) Зачем мьютекс?
5) Цикл завершится - в этом уверен. Раз цикл завершится, то run ничего делать не будет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.6.2009, 15:08
Сообщение #16


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

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

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




Репутация:   29  


Цитата(AD @ 15.6.2009, 13:33) *
QTime starting_time, finished_time; ///< время начала и окончания отсчета


Такую ситуацию ты не предусматриваешь?
starting_time = 23,59,00
finished_time = 00,02,00

finished_time лучше сделать не конечным временем, а интервалом
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.6.2009, 15:17
Сообщение #17


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

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

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




Репутация:   17  


Цитата(igor_bogomolov @ 15.6.2009, 16:08) *
Цитата(AD @ 15.6.2009, 13:33) *
QTime starting_time, finished_time; ///< время начала и окончания отсчета


Такую ситуацию ты не предусматриваешь?
starting_time = 23,59,00
finished_time = 00,02,00

finished_time лучше сделать не конечным временем, а интервалом

Что с msleep то?

На счет ситуации не знаю пока.

Такую ситуацию сам Qtime отследит: :)
Цитата
int QTime::secsTo ( const QTime & t ) const
Returns the number of seconds from this time to t. If t is earlier than this time, the number of seconds returned is negative.
Because QTime measures time within a day and there are 86400 seconds in a day, the result is always between -86400 and 86400.
See also addSecs() and QDateTime::secsTo().


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


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

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

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




Репутация:   29  


Цитата(AD @ 15.6.2009, 16:04) *
1) Да. Поправил. Бывает.... Спасибо.
2) Куда и как добавить? Подскажи, пожалуйста.
3) Доп. поток, потому что это только начало работы потока. Там более сложная структура.
4) Зачем мьютекс?
5) Цикл завершится - в этом уверен. Раз цикл завершится, то run ничего делать не будет.

1) Не за что
2) В любом месте цикла while, лучше в конце.
3) Ок.
4) Для того чтобы защитить данные в _time. Он у тебя может измениться из вне. И emit timeout(_time) отправит не правильные данные.
5) А я вот совершенно не уверен (по тому коду, что сейчас есть). Что произойдет, когда int secs станет отрицательным. t = t.addSecs(secs) останется инициализированным нулями? Я не проверял такого поведения.


Цитата(AD @ 15.6.2009, 16:17) *
Такую ситуацию сам Qtime отследит:
Возвратит отрицательное значение. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.6.2009, 15:31
Сообщение #19


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

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

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




Репутация:   17  


Цитата(igor_bogomolov @ 15.6.2009, 16:23) *
Возвратит отрицательное значение. ;)

Цитата
QTime QTime::addSecs ( int s ) const
Returns a QTime object containing a time s seconds later than the time of this object (or earlier if s is negative).
Note that the time will wrap if it passes midnight.
Example:
QTime n(14, 0, 0); // n == 14:00:00
QTime t;
t = n.addSecs(70); // t == 14:01:10
t = n.addSecs(-70); // t == 13:58:50
t = n.addSecs(10 * 60 * 60 + 5); // t == 00:00:05
t = n.addSecs(-15 * 60 * 60); // t == 23:00:00
See also addMSecs(), secsTo(), and QDateTime::addSecs().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 15.6.2009, 15:33
Сообщение #20


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

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

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




Репутация:   23  


Цитата(kwisp @ 15.6.2009, 15:50) *
значит я чего-то не допонял.:)

если честно тоже не пойму зачем доп. поток?
мне просто скоро тоже вплотную со временем работать.
расскажи поподробнее что по чем. зачем тебе сигналить timout`ом каждую секунду?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 17.5.2024, 16:25