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

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Как добавить файл .cpp в проект?  (Прочитано 26629 раз)
Alexu007
Гость
« Ответ #30 : Декабрь 08, 2013, 21:50 »

Эту штуку я видел, но мне не нужно время работы функции в милисекундах. Мне нужно, чтобы на форме нарисовалось 00:00:00 и во время работы программы время росло. В билдере это реализуется так: получаем время т1 и т2, и затем т2 минус т1 получаем то что нужно. В Qt я тоже два времени получил, но они не "умеют" вычитаться друг из друга. В принципе, руками несложно "допилить" такое вычитание, но как то мне кажется должно быть готовое решение
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #31 : Декабрь 08, 2013, 22:23 »

В Qt я тоже два времени получил, но они не "умеют" вычитаться друг из друга

Ты документацию не читаешь принципиально, или это такая секта? Люди, которые никогда не читают документацию, иначе наступит конец времён Строит глазки
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #32 : Декабрь 08, 2013, 22:35 »

Вот написал функцию, которая по миллисекундам рассчитает время:
Код
C++ (Qt)
QTime fromMSec( quint64 totalMsec )
{
   uint hour = totalMsec / 1000 / 60 / 60 % 60;
   uint minute = totalMsec / 1000 / 60 % 60;
   uint sec = totalMsec / 1000 % 60;
   uint msec = totalMsec % 1000;
 
   return QTime( hour, minute, sec, msec );
}
 

Используем так:
Код
C++ (Qt)
QTime t1 = QTime::currentTime();
 
// Выполняется какой-то код
 
// Получим разницу в миллисекундах, можно и в секундах, но лучше более высокая точность
// на всякий случай, поместим полученную разницу в модуль - нам
// не нужно отрицательное время
qint64 msec = qAbs( QTime::currentTime().msecsTo( t1 ) );
 
QTime t3 = fromMSec( msec );
qDebug() << "Всего миллисекунд: " << msec << " <=> " << t3.toString( "hh:mm:ss.zzz" );
 

ЗЫ. функция должна правильно работать, но лучше протестить ее - у меня глубокая ночь и потому мог накосячить и не заметить Улыбающийся
« Последнее редактирование: Декабрь 08, 2013, 22:38 от gil9red » Записан

Alexu007
Гость
« Ответ #33 : Декабрь 08, 2013, 22:51 »

Да смотрел я документацию по QTime, ничего похожего не нашёл. Да ещё по английски всё. Ну покажите тупому. У меня есть два системных времени, например 22.33.45 и 23.43.50, как мне получить 01.10.05

И вообще как-то мимо логики всё, если не сказать хуже. Допустим создаём

QTime time;

Она создаётся "пустая", если сразу её на экран, то вообще ничего не выводится, даже нулей. Ну ладно.

time.Start();

вовсе не заставляет её куда-то стартовать, а записывает в неё системное время. Тоже ладно.

time.setHMS (0, 0);

обнуляет - отлично. После неё самое время бы Start - и пошли часики тикать с нуля, а не тут то было. Start опять тупо запишет в неё системное время, я проверял. Не знаю, может кому это кажется понятным, мне - нет.



 
Записан
Alexu007
Гость
« Ответ #34 : Декабрь 08, 2013, 22:54 »

ЗЫ. функция должна правильно работать, но лучше протестить ее - у меня глубокая ночь и потому мог накосячить и не заметить Улыбающийся
Спасибо, попробую.
« Последнее редактирование: Декабрь 08, 2013, 22:57 от Alexu007 » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #35 : Декабрь 08, 2013, 23:04 »

Цитировать
QTime time;
Она создаётся "пустая", если сразу её на экран, то вообще ничего не выводится, даже нулей. Ну ладно.
time.Start();
вовсе не заставляет её куда-то стартовать, а записывает в неё системное время. Тоже ладно.
time.setHMS (0, 0);
обнуляет - отлично. После неё самое время бы Start - и пошли часики тикать с нуля, а не тут то было. Start опять тупо запишет в неё системное время, я проверял. Не знаю, может кому это кажется понятным, мне - нет.

Просто вы не совсем правильно используете Улыбающийся

Ничего не нужно обновлять
И прошедшее время с start() или restart() не появится в экземпляре QTime,
и получить его мы можем только с помощью elapsed().
Код
C++ (Qt)
QTime t;
t.start();
// выполняется какой то код
qDebug("Time elapsed: %d ms", t.elapsed());
 

Цитировать
Sets this time to the current time
void QTime::start()
{
    *this = currentTime();
}
Устанавливает в экземпляре текущее время

Цитировать
Returns the number of milliseconds that have elapsed since the last time start() or restart() was called.
int QTime::elapsed () const
{
       int n = msecsTo(currentTime());
       if (n < 0)                                // passed midnight
           n += 86400 * 1000;
       return n;
}
Возвращает количество миллисекунд, которые прошли с последнего вызова методов start() или restart().

Можете сами убедиться, вот исходный код тех функций:
http://code.woboq.org/qt5/qtbase/src/corelib/tools/qdatetime.cpp.html#_ZNK5QTime7elapsedEv
Записан

Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #36 : Декабрь 08, 2013, 23:08 »

Да ещё по английски всё

В этой индустрии без английского вообще никуда. Или учи сразу, или просто не берись за это.

Допустим создаём

QTime time;

Она создаётся "пустая", если сразу её на экран, то вообще ничего не выводится, даже нулей. Ну ладно.

Естественно, дефолтный QTime - это невалидный QTime. Это документировано.

time.Start();
вовсе не заставляет её куда-то стартовать, а записывает в неё системное время. Тоже ладно.

Да, и это документировано тоже. А пройденное время доступно в elapsed().

Не знаю, может кому это кажется понятным, мне - нет.

Ты хочешь писать на Qt методом интуиции?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #37 : Декабрь 08, 2013, 23:08 »

Вот написал функцию, которая по миллисекундам рассчитает время:

Господи, сектанты отаке!!

Код
C++ (Qt)
QTime t(0, 0, 0);
qDebug() << t.addSecs(60*60*2 + 14*60 + 10); // 2h 14min 10sec
 
« Последнее редактирование: Декабрь 08, 2013, 23:10 от Alex Custov » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #38 : Декабрь 08, 2013, 23:10 »

Вот написал функцию, которая по миллисекундам рассчитает время:

Господи!!

Код
C++ (Qt)
QTime t(0, 0, 0);
qDebug() << t.addSecs(60*60*2 + 14*60 + 10); // 2h 14min 10sec
 

А теперь модернизируйте ваш код, чтобы он точно рассчитывал разницу времени Улыбающийся

UPDATE.
Хотя не нужно, мы не гордые Улыбающийся
Код
C++ (Qt)
QTime t;
t.start();
// выполняется сектанский код
int msec = t.elapsed();
 
QTime t2 = QTime(0, 0, 0).addMSecs( msec );
 
qDebug() << t2.toString("hh:mm:ss.zzz");
« Последнее редактирование: Декабрь 08, 2013, 23:22 от gil9red » Записан

carrygun
Гость
« Ответ #39 : Декабрь 09, 2013, 05:22 »

Есть же QElapsedTimer, проще помоему некуда.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #40 : Декабрь 09, 2013, 14:40 »

Да смотрел я документацию по QTime, ничего похожего не нашёл. Да ещё по английски всё. Ну покажите тупому.
Ну да, чего-то там читать, разбираться - да спрошу на форуме, ведь он для этого и предназначен! В конце-концов что я теряю? Так или нет?  Улыбающийся

Поверьте, эта дорожка хожена (очень) многими, но я не помню ни одного которому она хоть что-то дала. Пока напишите, пока дождетесь ответа, отреагируете - Вы просто теряете время. Работать с документацией придется все равно, и много, так что чем раньше - тем лучше. Не злоупотребляйте доверием форумчан, ничем хорошим это не кончается. 
Записан
Alexu007
Гость
« Ответ #41 : Декабрь 09, 2013, 14:44 »

Спасибо всем за помощь. Я решил сделать по другому. Таймер раз в секунду будет и время считать и количество обработанных фреймов.
Записан
Alexu007
Гость
« Ответ #42 : Декабрь 09, 2013, 19:37 »

Че то проблемы с таймером. Я его создал, соединил со слотом, все как положено. Таймер работает - тестовые цифирки переключаются. Но когда я нажимаю кнопку "кодирование" и начинается собственно кодирование - таймер встаёт и продолжает работу только после окончания кодирования. QApplication::processEvents(); я в слот таймера вставил - безрезультатно.

Что я сделал неправильно?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #43 : Декабрь 09, 2013, 20:05 »

QApplication::processEvents(); я в слот таймера вставил - безрезультатно.

Интересно, исходя из всего вышесказанного, зачем это было сделано? Если таймер на форме не обновляется, значит слот не вызывается, логично?

P.S. Делай кодирование в потоке чтобы не загружать основной поток.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #44 : Декабрь 09, 2013, 20:34 »

Спасибо всем за помощь. Я решил сделать по другому. Таймер раз в секунду будет и время считать и количество обработанных фреймов.
Таймер работает синхронно, т.е. событие таймера приходит из очереди событий так же как и другие. Делайте выводы и не мельтешите с преждевременными вопросами
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


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