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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Аналог Sleep, GetTickCount  (Прочитано 27388 раз)
SABROG
Гость
« : Май 07, 2007, 11:52 »

Есть кросовые аналоги для Sleep и GetTickCount ?
Записан
WW
Гость
« Ответ #1 : Май 07, 2007, 13:37 »

qSleep? qWait?
Записан
SABROG
Гость
« Ответ #2 : Май 07, 2007, 13:58 »

Угу. Только они пока в тестовом режиме (QTestLib)
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #3 : Май 07, 2007, 15:11 »

sleep есть в QThread
а зачем вам использовать в GUI программе sleep
Записан
SABROG
Гость
« Ответ #4 : Май 07, 2007, 16:28 »

Пока незачем. А если придется эмулировать задержку ? Можно конечно поюзать QTimer, правда я не знаю можно ли его заставить не вызывать ничего после истечения времени.
Записан
QCasper
Гость
« Ответ #5 : Май 07, 2007, 20:34 »

Цитата: "SABROG"
Пока незачем. А если придется эмулировать задержку ? Можно конечно поюзать QTimer, правда я не знаю можно ли его заставить не вызывать ничего после истечения времени.


Можно придумать хотя бы один пример, для чего реально может понадобиться замораживать главный ГУИ поток? Зачем может понадобиться эмулировать задержку?
Записан
Mixolap
Гость
« Ответ #6 : Май 07, 2007, 20:39 »

Может понадобиться для задержки отображения сплеш-скрина (преднамеренно подольше показать сплешскрин, если  программа быстро загружается)
Записан
Gryz
Гость
« Ответ #7 : Май 07, 2007, 23:13 »

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


У меня был случай, когда понадобилась задержка GUI потока (правда в Delphi). Задержка была нужна при чтении данных со сканера штрих-кодов, подключенного к ком порту. Событие считывания уже срабатывало, т.е. вызывался обработчик события, но данные похоже в буфер не до конца со сканера переписывались.
Перед чтением данных сделал sleep. Как показалось, самое быстрое решение.
Записан
QCasper
Гость
« Ответ #8 : Май 08, 2007, 08:48 »

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


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


Понятное дело, что самое быстрое. Но и самое кривое решение. Мне вот как пользователю гораздо более приятно смотреть на прогресс бар, нежели гадать, повисло ли приложение, или все же еще выполняет полезную работу.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Май 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())
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Gryz
Гость
« Ответ #10 : Май 08, 2007, 15:30 »

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


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


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


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

Какие минусы у этого "костыля"?
Какое решение было бы лучше?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Май 08, 2007, 16:22 »

Цитата: "Gryz"

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


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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #12 : Май 09, 2007, 22:17 »

Задержка:

Код:

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


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

Код:

Sleeper::msleep(10000);
Записан
SLiDER
Гость
« Ответ #13 : Май 09, 2007, 22:24 »

Задержать главный поток может понадобится при тестировании и отладке многопоточных приложений, и для этого можно и нужно, как раз, использовать QTest (это не тестовая библиотека, а библиотека для тестов).
Записан
Разуев Максим
Гость
« Ответ #14 : Май 25, 2007, 04:18 »

Так каким всетаки образом сделать задержку на нужное количество секунд в программе.
У меня такой пример нужды: Между некоторыми действиями (показ картинки, проигрывание звука) необходимо подождать заранее заданное количество секунд. (Программа обучения).
Есть ли смысл использовать QTest не по назначению, как это отобразится на прграмме.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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