Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на 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)