Russian Qt Forum

Qt => Работа с сетью => Тема начата: thechicho от Сентябрь 30, 2011, 20:14



Название: Измерение времени
Отправлено: thechicho от Сентябрь 30, 2011, 20:14
Подскажите, как измерять время?

Аналог на php:

Код:
$start = microtime(1);
$time = microtime(1) - $start;


Название: Re: Измерение времени
Отправлено: Пантер от Сентябрь 30, 2011, 20:18
QTime::elapsed () ?


Название: Re: Измерение времени
Отправлено: andrewshkovskii от Сентябрь 30, 2011, 20:20
ну для этого надо было бы вызвать сначала start/restart.
Просто этот парень доку не читает, не допер бы.


Название: Re: Измерение времени
Отправлено: kambala от Сентябрь 30, 2011, 20:21
еще clock() можно


Название: Re: Измерение времени
Отправлено: thechicho от Сентябрь 30, 2011, 20:53
// Просто этот парень доку не читает, не допер бы.
за базар ответишь?

а ваще поставь себя на мое место.
чо бы ты там стал читать, чтобы найти ответ на мой вопрос? все?!

я уже зае ее читать!
а ответ на подобные вопросы, бывает приходится искать часами!
поэтому и спросил тут.

сорри, просто реально устал. сложно дается, т.к. не знаю плюсы ( не надо советовать их учить ток, я понемногу разбираюсь на реальных примерах, а теорию читать не вижу больше смысла, т.к. прочитал эту х http://valera.asf.ru/cpp/book/ (ВСЕ прочитал) и ничо не понял - примеры не разбирал правда, ибо там какая-то лажа или университетский уровень (аля числа фибоначи и прочая х, кот. мне никогда не пригодится) )

сенкс, за ваши ответы.
буду пробовать.


Название: Re: Измерение времени
Отправлено: andrewshkovskii от Сентябрь 30, 2011, 21:13
Молодой человек, прошу Вас, успокойтесь, я могу и ответить, если хотите - Вам не понравиться.
Поставил  - c qt поставляется отличный асистент с контекстным поиском и индексированием, набираешь time.. находишь класс QTime, логически подумать как измерить время -> находишь нужные методы - все просто, достаточно подумать.
С Вашим подходом к изучению программирования у Вас так мало что выйдет, говнокод да и только.
Я понимаю что ПХП Вам позволило просто создавать сайтики, но этого мало, что бы по-настоящему программировать.


Название: Re: Измерение времени
Отправлено: thechicho от Сентябрь 30, 2011, 21:23
красиво говорите!
но Вы не поняли о чем я.

мне проги нужны для своих нужд, я не собираюсь работать кодером на Qt (нафик этот геморрой).
так что и говнокод сойдет для начала, лишь бы прога делала то, что мне надо!!!
хотя не отказался бы от советов по оптимизации говнокода! (чтобы прога быстрее работала)
а вот на эстетику кода и все такое, мне пофик.

// не понравиться
пишется без ь. привет от http://lurkmore.ru/Grammar_nazi (http://lurkmore.ru/Grammar_nazi) . Вы бы с ним нашли общий язык полюбому)
ы


Название: Re: Измерение времени
Отправлено: Igors от Сентябрь 30, 2011, 21:50
находишь класс QTime, логически подумать как измерить время -> находишь нужные методы - все просто, достаточно подумать.
"Подумать" не требуется, тем более "логически". Берется готовый класс и пользуется. В подробности вдаваться не нужно, достаточно передрать пример (обычно с той же страницы где и описание класса). Напр

Цитировать
QTime t;
 t.start();
 some_lengthy_task();
 qDebug("Time elapsed: %d ms", t.elapsed());

Ну конечно подставить что-то свое вместо some_lengthy_task - и вот Вы уже вполне доросли чтобы обозвать кого-то говнокодером  :)


Название: Re: Измерение времени
Отправлено: andrewshkovskii от Сентябрь 30, 2011, 22:18
Я в шоке. Хорошему учишь.


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 01, 2011, 19:54
andrewshkovskii, Вы б лучше помогли.

подскажите, как... не знаю как это правильно называется.

в общем в первом слоте:
Код
C++ (Qt)
QElapsedTimer timer;
timer.start();

в последнем:
Код
C++ (Qt)
qDebug() << timer.elapsed();

как это делается?


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 01, 2011, 20:03
пробовал тупо добавить QElapsedTimer timer; в последнем слоте.

тогда:

Код
C++ (Qt)
qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
qDebug() << "The slow operation took" << timer.elapsed()/1000 << "seconds";
qDebug() << "The slow operation took" << timer.elapsed()/1000/60 << "minutes";

The slow operation took 8593622089 milliseconds
The slow operation took 8593622 seconds
The slow operation took 143227 minutes

хотя времени проходит секунд 15


Название: Re: Измерение времени
Отправлено: kambala от Октябрь 01, 2011, 20:33
видимо timer.start(); забыл раз "пробовал тупо добавить QElapsedTimer timer;"


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 01, 2011, 20:40
бл...
сложно так помочь чтоле?

выше сообщение прочитай мое.


Название: Re: Измерение времени
Отправлено: kambala от Октябрь 01, 2011, 21:07
вот тебе рабочий код, ошибки у себя ищи сам:
Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QElapsedTimer>
#include <Windows.h>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QElapsedTimer t;
   t.start();
   qDebug("%d", t.elapsed());
   Sleep(10000);
   qDebug("%d", t.elapsed());
 
   return a.exec();
}
Цитата: Вывод
Запускается C:\Qt\timer-build-desktop-Qt_4_7_4_for_Desktop_-_MSVC2008__Qt_SDK_________\debug\timer.exe...
0
10000

а, я вроде телепатически понял чего ты добиваешься (сам же не хочешь нормально описать что нужно) - узнавать в разных методах/слотах сколько времени прошло с момента запуска таймера. для этого надо поместить переменную типа QElapsedTimer в свой класс и запустить ей start() перед вызовом первого метода/слота, тогда ты сможешь обращаться к этой переменной в любом месте своего класса.


Название: Re: Измерение времени
Отправлено: BRE от Октябрь 01, 2011, 21:11
как это делается?
Код
C++ (Qt)
class MyClass : public QObject
{
...
public slots:
void slot1()
{
timer.start();
}
 
void slot2()
{
qint64 res = timer.elapsed();
qDebug() << "The slow operation took" << res << "milliseconds";
qDebug() << "The slow operation took" << res/1000 << "seconds";
qDebug() << "The slow operation took" << res/1000/60 << "minutes";
}
 
private:
QElapsedTimer timer;
};
 


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 01, 2011, 21:22
биг сенкс!
завтра буду пробовать. доброй ночи)


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 02, 2011, 10:01
// Запускается C:\Qt\timer-build-desktop-Qt_4_7_4_for_Desktop_-_MSVC2008__Qt_SDK_________\debug\timer.exe...
если галочку Use Shadow Building убрать, не будут левые папки создаваться :P

// QElapsedTimer в свой класс и запустить ей start() перед вызовом первого метода/слота
не. в первом слоте надо запускать :)

// private:
//   QElapsedTimer      timer;
а в чем разница между private и public?
вот если бы я написал:
Код
C++ (Qt)
public:
   QElapsedTimer timer;
чо бы изменилось?


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 02, 2011, 10:18
//qint64 res = timer.elapsed();
qreal res = timer.elapsed();

в Qt есть средство для округления до сотых?
или ток так http://www.qtforum.org/article/4680/round-a-double-to-2-decimal-places.html


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 02, 2011, 10:37
Sleep(10000);
как использовать?
'Sleep' was not declared in this scope

ток так можно округлить до сотых?
qreal res = timer.elapsed();
qreal sres = res/1000;
qreal mres = sres/60;
QString sresult = QString::number(sres, 'f', 2);
qDebug() << "The slow operation took" << res << "milliseconds";
qDebug() << "The slow operation took" << sresult << "seconds";
qDebug() << "The slow operation took" << mresult << "minutes";


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 02, 2011, 11:11
Код
C++ (Qt)
qlonglong res = timer.elapsed();
qlonglong s = res/1000; QString ss = QString::number(s);
qlonglong m = s/60; QString mm = QString::number(m);
qlonglong h = m/60; QString hh = QString::number(h);
QString timeelapsed = hh + ":" + mm + ":" + ss;
 
qDebug() << res << "ms";
qDebug() << "Времени прошло: " << timeelapsed;

как-то проще можно было сделать?


Название: Re: Измерение времени
Отправлено: kambala от Октябрь 02, 2011, 11:43
// Запускается C:\Qt\timer-build-desktop-Qt_4_7_4_for_Desktop_-_MSVC2008__Qt_SDK_________\debug\timer.exe...
если галочку Use Shadow Building убрать, не будут левые папки создаваться :P
спасибо, кэп
а в чем разница между private и public?
вот если бы я написал:
Код
C++ (Qt)
public:
   QElapsedTimer timer;
чо бы изменилось?
иди изучай С++
Sleep(10000);
как использовать?
'Sleep' was not declared in this scope
посмотреть внимательно на приведенный код или хотя бы просто нагуглить эту функцию и посмотреть в каком файле она объявлена. #include <Windows.h> (на юниксах есть своя функция sleep())


Название: Re: Измерение времени
Отправлено: Igors от Октябрь 02, 2011, 12:15
как-то проще можно было сделать?
Проще не знаю, правильнее можно

Код
C++ (Qt)
int res = timer.elapsed();  // elapsed вернет int
int sec = res / 1000;
int min = sec / 60;
sec %= 60;
int hr = min / 60;
min %= 60;
char buf[128];
sprintf(buf, "%2d : %2d : %2d", hr, min, sec);
qDebug() << "Времени прошло: " << buf;
 

Не Вы первый пытаетесь использовать форум как "живой хелп" :) Особо тяжкого преступления Вы не совершаете, но это просто неэффективно: пока напишете вопрос, пока дождетесь ответа (а потом отреагируете на заслуженное посылание к учебнику :)) - за это время самому несколько раз можно было разобраться. Спрашивайте обдуманно - и результат будет другим.


Название: Re: Измерение времени
Отправлено: kambala от Октябрь 02, 2011, 12:39
qint64 QElapsedTimer::elapsed() const


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 02, 2011, 13:20
// спасибо, кэп
 :P

// иди изучай С++
дак это... я читал про эту фигню. там какие-то таблицы с наследованием. как чо меняется при наследовании и тп.
но я не понял как надо рассуждать, когда пихаешь в public, или в private, или в protected.
прост я запихал в паблик, проверил - работает. запихал в прайвит, тоже работает. вот и спросил какая-разница и из чего надо исходить, когда решаешь куда чо запихать.

//посмотреть внимательно на приведенный код или хотя бы просто нагуглить эту функцию и посмотреть в каком файле она объявлена. #include <Windows.h> (на юниксах есть своя функция sleep())
дак я в ассистанте глянул, там в QThread ток было. я попробовал воткнуть в код, но чота не заработало...^^
а т.к. в Вашем примере вроде как должно работать, а никаких Qt инклюдов для этого не увидел, то подумал, что это не Qt-way и делается как-то через жопу, поэтому дальше искать не стал. оказалось, тупо надо было windows.h заинклюдить) сенкс заработало)


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 02, 2011, 13:35
О_о

дак если юзать Sleep(100000);
прога (gui) зависает же...


Название: Re: Измерение времени
Отправлено: kambala от Октябрь 02, 2011, 13:46
вот и спросил какая-разница и из чего надо исходить, когда решаешь куда чо запихать.
обычно в private (или в protected если собираешься в будущем наследоваться от этого класса и эти переменные будут нужны)
О_о

дак если юзать Sleep(100000);
прога (gui) зависает же...
так никто ж и не спорит :) то был просто показательный пример корректного функционирования таймера.


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 02, 2011, 14:23
// обычно в private
так почему. я не понимаю какая разница. и как мне надо думать, когда добавляю новый объект. вот Вы как рассуждаете, когда создаете новый объект какой-нить и решаете куда его запихать?

с Sleep(); все пучком) работает как часы, во всех смыслах)

Igors, да остаток не учел. сенкс:)
правда немного подправил, т.к. в доке написано:
Цитировать
Warning: We do not recommend using QString::sprintf() in new Qt code. Instead, consider using QTextStream or arg(), both of which support Unicode strings seamlessly and are type-safe. Here's an example that uses QTextStream:

в итоге получилось:
Код
C++ (Qt)
   qint64 res = timer.elapsed();
   qint64 sec = res / 1000;
   qint64 min = sec / 60;
   qint64 hr = min / 60;
   sec %= 60;
   min %= 60;
 
   QString timeElapsed = QString("%1:%2:%3").arg(hr).arg(min).arg(sec);
   //QString timeElapsed; QTextStream(&timeElapsed) << hr << ":" << min << ":" << sec;
 
   qDebug() << res << "ms";
   qDebug() << "Времени прошло: " << timeElapsed;

по поводу "живого хелпа". форум, имхо, как вариант, это средство взаимопомощи. я сам с радостью помогаю в том, в чем шарю.
по поводу эффективности. разумеется, я сначала сам пытаюсь сделать. не получается, пишу на форум проблему и надеюсь, что кто-нить, кто шарит, поможет мне разобраться. быстрее разобраться! я же не сижу тупо и не жду, когда мне готовый код "принесут на блюдечке", в это время я пытаюсь решить проблему сам. или пока переключаюсь на решение других проблем, если в тупик тут захожу.
как пример, вот тема http://www.prog.org.ru/topic_19577_0.html
я сначала сам мучил, но не допер как сделать.
потом на форуме написал в надежде, что кто-нить сталкивался с подобной проблемой и поможет мне ее решить побырому.
но, когда я написал, я же тупо не сидел и не ждал, а сам пытался сделать чо мне надо. в итоге так ничо и не получилось у меня! потратил несколько часов!
но, zenden, выручил, т.к. шарит в этом. все гениальное просто! я в шаге был от самостоятельного решения этой проблемы, но не додумал!
вот, и таких моментов довольно много возникает, поэтому пишу на форум. и не вижу ничего в этом плохого, т.к. чем больше уникального контента на сайте, тем лучше:) может у кого-нить когда-нить подобная проблема тоже возникнет, он найдет эту тему и решит ее сразу. т.е. таким образом мы помогаем друг другу сократить время на решение банальны проблем! ну это в общем мое имхо) сенкс еще раз)


Название: Re: Измерение времени
Отправлено: kambala от Октябрь 02, 2011, 15:38
так почему. я не понимаю какая разница. и как мне надо думать, когда добавляю новый объект. вот Вы как рассуждаете, когда создаете новый объект какой-нить и решаете куда его запихать?
в public выношу только те методы/константы, которые будет/может вызывать/считывать "пользователь" данного класса. если неконстантые переменные помещать в public, то "пользователь" сможет присваивать им что захочет, что может быть чревато. для этих целей создаются специальные методы-сеттеры, которые контролируют устанавливаемые значения.


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 02, 2011, 15:54
сенкс за ответ :)
помогите тут еще плз, я застрял http://www.prog.org.ru/topic_19579_0.html


Название: Re: Измерение времени
Отправлено: Igors от Октябрь 02, 2011, 20:22
прост я запихал в паблик, проверил - работает. запихал в прайвит, тоже работает. вот и спросил какая-разница и из чего надо исходить, когда решаешь куда чо запихать.
"чо" и.т.п. - ну это может забавно первые пару раз, а потом начинает раздражать/утомлять/доставать  :) Так что лучше без этой стилизации.

По поводу public/private. В теории все просто: мол, объявляя private мы тем самым заявляем что можем менять эти внутренние данные как хотим - и эти изменения не коснутся других частей приложения, оно будет продолжать работать. В жизни все сложнее. Нет проблем сделать все private и насовать побольше get/set методов, но это само по себе еще ничего не дает - части приложения остаются столь же зависимы друг от друга. На эту тему можно написать массу диссертаций, но простого ответа нет  Я часто применяю такой прием - сначала делаю все (ну или почти все) public и наблюдаю что получается плохо (где пошли злоупотребления). Потом меняю на private, добавляю методы (кстати довольно редко это простые get/set) - и дела идут лучше. Короче - познается на практике  :)


Название: Re: Измерение времени
Отправлено: thechicho от Октябрь 03, 2011, 10:09
// начинает раздражать/утомлять/доставать
http://lurkmore.ru/Grammar_nazi  :P
// но это само по себе еще ничего не дает - части приложения остаются столь же зависимы друг от друга. На эту тему можно написать массу диссертаций, но простого ответа нет
 :o уж лучше практических примеров, от диссертаций ща (в настоящее время* ы) толку мало)
// наблюдаю что получается плохо (где пошли злоупотребления)
// простые get/set
 ???
// Короче - познается на практике :)
сенкс :) буду делать как Вы. ток пихать все в private, чтоб не заморачиваться потом :D