Russian Qt Forum

Qt => Общие вопросы => Тема начата: SABROG от Май 07, 2007, 11:52



Название: Аналог Sleep, GetTickCount
Отправлено: SABROG от Май 07, 2007, 11:52
Есть кросовые аналоги для Sleep и GetTickCount ?


Название: Аналог Sleep, GetTickCount
Отправлено: WW от Май 07, 2007, 13:37
qSleep? qWait?


Название: Аналог Sleep, GetTickCount
Отправлено: SABROG от Май 07, 2007, 13:58
Угу. Только они пока в тестовом режиме (QTestLib)


Название: Аналог Sleep, GetTickCount
Отправлено: Admin от Май 07, 2007, 15:11
sleep есть в QThread
а зачем вам использовать в GUI программе sleep


Название: Аналог Sleep, GetTickCount
Отправлено: SABROG от Май 07, 2007, 16:28
Пока незачем. А если придется эмулировать задержку ? Можно конечно поюзать QTimer, правда я не знаю можно ли его заставить не вызывать ничего после истечения времени.


Название: Аналог Sleep, GetTickCount
Отправлено: QCasper от Май 07, 2007, 20:34
Цитата: "SABROG"
Пока незачем. А если придется эмулировать задержку ? Можно конечно поюзать QTimer, правда я не знаю можно ли его заставить не вызывать ничего после истечения времени.


Можно придумать хотя бы один пример, для чего реально может понадобиться замораживать главный ГУИ поток? Зачем может понадобиться эмулировать задержку?


Название: Аналог Sleep, GetTickCount
Отправлено: Mixolap от Май 07, 2007, 20:39
Может понадобиться для задержки отображения сплеш-скрина (преднамеренно подольше показать сплешскрин, если  программа быстро загружается)


Название: Аналог Sleep, GetTickCount
Отправлено: Gryz от Май 07, 2007, 23:13
Цитата: "QCasper"
Можно придумать хотя бы один пример, для чего реально может понадобиться замораживать главный ГУИ поток? Зачем может понадобиться эмулировать задержку?


У меня был случай, когда понадобилась задержка GUI потока (правда в Delphi). Задержка была нужна при чтении данных со сканера штрих-кодов, подключенного к ком порту. Событие считывания уже срабатывало, т.е. вызывался обработчик события, но данные похоже в буфер не до конца со сканера переписывались.
Перед чтением данных сделал sleep. Как показалось, самое быстрое решение.


Название: Аналог Sleep, GetTickCount
Отправлено: QCasper от Май 08, 2007, 08:48
Цитата: "Gryz"
Цитата: "QCasper"
Можно придумать хотя бы один пример, для чего реально может понадобиться замораживать главный ГУИ поток? Зачем может понадобиться эмулировать задержку?


У меня был случай, когда понадобилась задержка GUI потока (правда в Delphi). Задержка была нужна при чтении данных со сканера штрих-кодов, подключенного к ком порту. Событие считывания уже срабатывало, т.е. вызывался обработчик события, но данные похоже в буфер не до конца со сканера переписывались.
Перед чтением данных сделал sleep. Как показалось, самое быстрое решение.


Понятное дело, что самое быстрое. Но и самое кривое решение. Мне вот как пользователю гораздо более приятно смотреть на прогресс бар, нежели гадать, повисло ли приложение, или все же еще выполняет полезную работу.


Название: Re: Аналог Sleep, GetTickCount
Отправлено: pastor от Май 08, 2007, 10:46
Послностью согласен с QCasper, решение предложеное Gryz это просто костыль, в корне неправильное решение.

По теме...

Цитата: "SABROG"
Есть кросовые аналоги для Sleep и GetTickCount ?


Помоему кросового варианте для sleep нет. Можешь сделать так:

Цитировать
void sleep(unsigned int  umilliseconds  )
{
#ifdef Q_WS_WIN
    Sleep(umilliseconds);
#else
    usleep( umilliseconds * 1000 );
#endif
}


Насчёт GetTickCount. Для каких целей тебе нужно использовать эту функцию.  Если для замеров времени, то можно применить QTime (см. методы elapsed(), start())


Название: Аналог Sleep, GetTickCount
Отправлено: Gryz от Май 08, 2007, 15:30
Цитата: "QCasper"
Цитата: "Gryz"
Цитата: "QCasper"
Можно придумать хотя бы один пример, для чего реально может понадобиться замораживать главный ГУИ поток? Зачем может понадобиться эмулировать задержку?


У меня был случай, когда понадобилась задержка GUI потока (правда в Delphi). Задержка была нужна при чтении данных со сканера штрих-кодов, подключенного к ком порту. Событие считывания уже срабатывало, т.е. вызывался обработчик события, но данные похоже в буфер не до конца со сканера переписывались.
Перед чтением данных сделал sleep. Как показалось, самое быстрое решение.


Понятное дело, что самое быстрое. Но и самое кривое решение. Мне вот как пользователю гораздо более приятно смотреть на прогресс бар, нежели гадать, повисло ли приложение, или все же еще выполняет полезную работу.


Сканер штрих кодов читает 13 - значное число. Перед чтением из буфера делаю задержу в 10 мс, что вполне хватает для корректного считывания. Следующее считывание возможно только по новому сканированию штрих-кода, т.е. по действию пользователя.

Какие минусы у этого "костыля"?
Какое решение было бы лучше?


Название: Аналог Sleep, GetTickCount
Отправлено: pastor от Май 08, 2007, 16:22
Цитата: "Gryz"

Какие минусы у этого "костыля"?
Какое решение было бы лучше?


Минус в том, что не факт что за 10мс данные будут в ком порте и ты сможешь их прочесть. За это время может прийти часть данных. Это может быть вызвано разными причинами, например темиже настройками сканера, ком порта или прочим.

Мы делали как: У нас был потом, который работал со сканером. В сканере задавались определённые терминальные симполы. Далее, когда данных в порте нет, мы усыпляли потом (но не слипом). Как только появлялись данные в порте мы считывали их (9 или 13 байт) до тех пор, пока не встретяться терминальные символы. Этим  обеспечивалось полнота считывания штрих кода.


Название: Аналог Sleep, GetTickCount
Отправлено: Alex Custov от Май 09, 2007, 22:17
Задержка:

Код:

struct Sleeper : private QThread
{
    static void msleep(unsigned long msecs) { QThread::msleep(msecs); }
};


Использование:

Код:

Sleeper::msleep(10000);


Название: Аналог Sleep, GetTickCount
Отправлено: SLiDER от Май 09, 2007, 22:24
Задержать главный поток может понадобится при тестировании и отладке многопоточных приложений, и для этого можно и нужно, как раз, использовать QTest (это не тестовая библиотека, а библиотека для тестов).


Название: Аналог Sleep, GetTickCount
Отправлено: Разуев Максим от Май 25, 2007, 04:18
Так каким всетаки образом сделать задержку на нужное количество секунд в программе.
У меня такой пример нужды: Между некоторыми действиями (показ картинки, проигрывание звука) необходимо подождать заранее заданное количество секунд. (Программа обучения).
Есть ли смысл использовать QTest не по назначению, как это отобразится на прграмме.


Название: Аналог Sleep, GetTickCount
Отправлено: SABROG от Май 25, 2007, 08:24
Вместо слипа можно использовать QTimer:

Код:

 #include <QApplication>
 #include <QTimer>

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     QTimer::singleShot(600000, &app, SLOT(quit()));
     ...
     return app.exec();
 }


А вот насчет GetTickCount вопрос остался открытым, хочу знать сколько тиков проходит от одного участка кода до другого.


Название: Аналог Sleep, GetTickCount
Отправлено: Tonal от Май 25, 2007, 10:23
Цитировать
void QTime::start ()
Sets this time to the current time. This is practical for timing:
Код:

 QTime t;
 t.start();
 some_lengthy_task();
 qDebug("Time elapsed: %d ms", t.elapsed());

Оно?


Название: Аналог Sleep, GetTickCount
Отправлено: pastor от Май 25, 2007, 11:15
Цитата: "Разуев Максим"
Так каким всетаки образом сделать задержку на нужное количество секунд в программе.


Выше было предложено несколько вариантов. Разве они не подходят?

добавлено спустя 4 минуты:

 
Цитата: "SABROG"

А вот насчет GetTickCount вопрос остался открытым, хочу знать сколько тиков проходит от одного участка кода до другого.


А чем не подходит QTime (statr(), elapsed())? Про это я писал несколькими постами выше.


Название: Аналог Sleep, GetTickCount
Отправлено: Разуев Максим от Май 26, 2007, 04:04
Во первых я говорил именно о задержке на нужное количество секунд в указанном месте (QTimer не подходит, он толоко генерирует событие). Про QTest я как раз и спросил что нужно ли пользоватся библиотекой для тестов в обычной программе.
Единственный вариант который я выкопал (а потом и увидел в ветке) это QTime.
Но при его применении возникла проблема:
Почемуто все периоды ожидания складываются, т.е. если было три действия с двумя промежутками по 3 секунды то сначала происходит ожидание 6 секунд, а потом подряд выполняются все действия хотя в программе они перебираются в последовательном цикле (дествие1 - ожидание1 - действие2 - ожидание2 - ...). Такое ощущение что QTime распараллеливается с основным циклом.
Не подскажете что нибудь а то очень нужно.
Дополнение:
Фактически у меня реализация мультиссылки - т.е. переключение нескольких страниц, рисунков, звуков и видео с промежутками между ними.
Нужна гарантированная задержка на n секунд.


Название: Аналог Sleep, GetTickCount
Отправлено: pastor от Май 26, 2007, 10:26
Цитата: "Разуев Максим"

Нужна гарантированная задержка на n секунд.


В одном из своих постов выше, я привёл код для sleep

Код:
void mysleep(unsigned int umilliseconds ) 
{
#ifdef Q_WS_WIN
    Sleep(umilliseconds);
#else
    usleep( umilliseconds * 1000 );
#endif
}


он не подходит?


Название: Аналог Sleep, GetTickCount
Отправлено: goer от Май 26, 2007, 10:52
Цитировать
А чем не подходит QTime (statr(), elapsed())? Про это я писал несколькими постами выше.


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


Ну так, стартуешь таймер и заходишь в свой QEventLoop. Он ничего не делает ~= задержка. В слоте elapsed() соответственно выходишь из QEventLoop-а.


Через системные вызовы впринципе тоже можно, тут уж кто за что ратует..


Название: Аналог Sleep, GetTickCount
Отправлено: Разуев Максим от Май 26, 2007, 13:57
Каким образом входить в QEventLoop, подскажи.

Цитата: "pastor"
Цитата: "Разуев Максим"

Нужна гарантированная задержка на n секунд.


В одном из своих постов выше, я привёл код для sleep

Код:
void mysleep(unsigned int umilliseconds ) 
{
#ifdef Q_WS_WIN
    Sleep(umilliseconds);
#else
    usleep( umilliseconds * 1000 );
#endif
}


он не подходит?


Поясни что за функции вызываются - системные?
Хотелось бы средствами Qt.
Кстати может можно както использовать функции QTread, а то sleep-ы в нем хоть и static но private(почему?).


Название: Аналог Sleep, GetTickCount
Отправлено: goer от Май 26, 2007, 15:35
Код:


QEventLoop el; //член данных класса

//организация задержки
QTimer::singleShot(600000, this, SLOT(timeout()));
el.exec();


void timeout() //слот того же класса
{
   el.quit();
}



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


Если вариант несработает то можно наследованием от QEventLoop-а.


Название: Аналог Sleep, GetTickCount
Отправлено: pastor от Май 26, 2007, 17:21
Цитата: "Разуев Максим"

Поясни что за функции вызываются - системные?
Хотелось бы средствами Qt.
Кстати может можно както использовать функции QTread, а то sleep-ы в нем хоть и static но private(почему?).


Да, это вызываються системные функции. Прямых аналогов в Qt нет


Название: Аналог Sleep, GetTickCount
Отправлено: Разуев Максим от Май 26, 2007, 23:53
Спасибо через EventLoop работает идеально.


Название: Аналог Sleep, GetTickCount
Отправлено: SABROG от Май 27, 2007, 10:07
Цитата: "Разуев Максим"
Спасибо через EventLoop работает идеально.


А цикл не грузит процессор ? А то ведь есть разница, одно дело остановить приложение и ничего не делать, а другое создать цикл, который все время будет прыгать туда-сюда выполняя машинную инструкцию.


Название: Аналог Sleep, GetTickCount
Отправлено: Разуев Максим от Май 27, 2007, 10:36
По времени вроде один в один.
Кстати дополнение:
Таймеры можно не создавать отдельно. Есть таймер встроеный в QObject.


Название: Аналог Sleep, GetTickCount
Отправлено: goer от Май 27, 2007, 10:54
Цитировать
А цикл не грузит процессор ?


А вот нет :) Любопытно что
Код:
while (true) ;

грузит проц на 100%, а QEventLoop::exec()  на 0%.


Название: Аналог Sleep, GetTickCount
Отправлено: Dimchansky от Май 31, 2007, 15:34
Цитата: "Разуев Максим"
Так каким всетаки образом сделать задержку на нужное количество секунд в программе.


Вам же выше Alex_X привел пример.