Версия для печати темы
Форум на CrossPlatform.RU _ Qt Общие вопросы _ Waitable timer
Автор: zss 30.3.2010, 10:27
нужно однократное срабатывание таймера с возможностью проверки состояния и запуска заново.
есть ли что для данных целей.
Автор: Litkevich Yuriy 30.3.2010, 10:32
Ну, собственно, QTimer
Автор: zss 30.3.2010, 10:45
Цитата(Litkevich Yuriy @ 30.3.2010, 10:32)
Ну, собственно, QTimer
да вот что-то не работает
QTimer timer;
timer.start(5 * 1000);
while (timer.isActive())
{
Sleep (100);
}
bool res = timer.isActive();
не выходит из цикла
Автор: kwisp 30.3.2010, 10:52
zss,
не то пишешь.
читай внимательно документацию по QTimer
есть метод void setSingleShot ( bool singleShot ) к примеру
+
статический метод
void singleShot ( int msec, QObject * receiver, const char * member )
Автор: zss 30.3.2010, 10:57
Цитата(kwisp @ 30.3.2010, 11:52)
есть метод void setSingleShot ( bool singleShot ) к примеру
ничего не поменялось
Автор: Litkevich Yuriy 30.3.2010, 11:11
Цитата(zss @ 30.3.2010, 14:57)
ничего не поменялось
а что ты сделал-то хоть?
Автор: zss 30.3.2010, 11:25
Цитата(Litkevich Yuriy @ 30.3.2010, 12:11)
Цитата(zss @ 30.3.2010, 14:57)
ничего не поменялось
а что ты сделал-то хоть?
QTimer timer;
timer.setSingleShot(true);
timer.start(5 * 1000);
while (timer.isActive())
{
Sleep (100);
}
bool res = timer.isActive();
судя по документации
Цитата
This property holds whether the timer is a single-shot timer.
A single-shot timer fires only once, non-single-shot timers fire every interval milliseconds.
Автор: kwisp 30.3.2010, 11:54
zss,
не удивительно, что ничего не поменялось!
зачем тебе и таймер и Sleep() ?
документацию не читал факт.
почему просто нельзя вызвать нужный метод с помощью статического метода ???
QTimer::singleShot(5000,this,SLOT(slMethod()))
=================
вот ещё метод
http://www.forum.crossplatform.ru/index.php?showtopic=3798&view=findpost&p=26811
Автор: zss 30.3.2010, 12:39
Цитата(kwisp @ 30.3.2010, 12:54)
zss,
не удивительно, что ничего не поменялось!
зачем тебе и таймер и Sleep() ?
документацию не читал факт.
почему просто нельзя вызвать нужный метод с помощью статического метода ???
QTimer::singleShot(5000,this,SLOT(slMethod()))
мне не нужен вызов метода. мне нужно ожидание отработки таймера.
Что-то вроде WaitForSingleObject на заданный период времени с возможностью проверки срабатывания.
З.Ы. Я вроде и тему так назвал. Sleep, чтоб просто показать, что есть некие действия
Автор: kwisp 30.3.2010, 12:44
Цитата(zss @ 30.3.2010, 13:39)
Sleep, чтоб просто показать, что есть некие действия
замечательно вводит в заблуждение по-моему.
while(timer.isActive()) -- не дает сработать циклу-обработчику событий, события времени -- обычные события, а ты запуская такой цикл не даешь обрабатывать события из очереди.
вариантов решения проблемы не один.
как вариант можно использовать
QCoreApplication::processEvents эта функция принудительно вызывает обработчик событий на месте своего вызова.
по ссылке мной приведённой ходил?
Автор: zss 30.3.2010, 12:51
Цитата(kwisp @ 30.3.2010, 13:44)
while(timer.isActive()) -- не дает сработать циклу-обработчику событий, события времени -- обычные события, а ты запуская такой цикл не даешь обрабатывать события из очереди.
странно - я думал, что таймеры это объекты режима ядра и выполняются они не в контексте текущего процесса.
Цитата(kwisp @ 30.3.2010, 13:44)
QCoreApplication::processEvents эта функция принудительно вызывает обработчик событий на месте своего вызова.
помогло. спасибо. Но думал, что есть что-то схожее с CreateWaitableTimer, который не зависит от цикла обработки событий.
Автор: kwisp 30.3.2010, 13:03
Цитата(zss @ 30.3.2010, 13:51)
странно - я думал, что таймеры это объекты режима ядра и выполняются они не в контексте текущего процесса.
Qt же кросплатформенная - видимо с этим связано выполнение в обработчике событий. может таймер и посчитал всё верно, однако возможно он становится неактивным по приходу события окончания отсчёта, а событие не может быть обработано из за
while(timer.isActive()) поэтому происходит зацикливание.
по-моему логично.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)