URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7840
[ Назад ]

Исходное сообщение
"CreateWaitableTimer "

Отправлено from_mars , 20-Янв-09 05:41 
В венде есть ф-я CreateWaitableTimer, которая создает таймер, который затем можно использовать в каком-нить потоке, в одной из WaitFor-функций. Т.е. поток ожидает события от таймера, просыпается по событию, делает свои дела, снова засыпает в ожидании события от таймера. Не важно, успел ли поток сделать свои дела до следующей сработки таймера, таймер стабильно будет сигналить в заданном интервале, это я к тому, что обычный sleep() не подойдет :)

Вопрос в том, как такое организовать в *никсах, в многопоточной проге? )


Содержание

Сообщения в этом обсуждении
"CreateWaitableTimer "
Отправлено mikra , 20-Янв-09 11:14 
>В венде есть ф-я CreateWaitableTimer, которая создает таймер, который затем можно использовать
>в каком-нить потоке, в одной из WaitFor-функций. Т.е. поток ожидает события
>от таймера, просыпается по событию, делает свои дела, снова засыпает в
>ожидании события от таймера. Не важно, успел ли поток сделать свои
>дела до следующей сработки таймера, таймер стабильно будет сигналить в заданном
>интервале, это я к тому, что обычный sleep() не подойдет :)
>
>
>Вопрос в том, как такое организовать в *никсах, в многопоточной проге? )
>

А вопрос конкретно в чем?
"Вопрос в том, как ТАКОЕ организовать в *никсах, в многопоточной проге?"
или
"Вопрос в том, как такое ОРГАНИЗОВАТЬ в *никсах, в многопоточной проге?"

Тоесть шашечки или ехать? :)


"CreateWaitableTimer "
Отправлено from_mars , 21-Янв-09 02:09 
Да вроде бы разобрался :) Нужно было следущее:
Есть многопоточная прога, нужно, чтобы один из потоков, через определенный переиод времени, получал сигнал (ну обязательно *никс сигнал, а просто сигнал, о событии), от которого этот поток просыпался, делал свое дело и дальше спать.
sleep() в цикле не подходит, потому что надо чтобы событие генерилось через строго опр. промежуток времени.

В венде это можно сделать так:

//не важно в каком потоке
...
hTimer = CreateWaitableTimer();
SetWaitableTimer(hTimer, 10 секунд);
...

//в одном из потоков

while(1) {
  WaitForSingleObject(hTimer);
  do_some_code(); // мы не знаем сколько времени займет выполнение кода
  // если код будет выполнятся дольше 10 сек, то след. вызов WaitForSingleObject(hTimer)
  // сразу же вернет управление, т.к. событие уже сгенерилось и ждет когда его заметят :)
  // поэтому поток не уйдет в спячку, а опять перейдет к do_some_code(). Вот почему
  // sleep() не подходит.
}

В *никсах это можно организовать с помощью timer_create() и sigsuspend(). Или может как-то с помощью SDL. А может еще как-то :)



"CreateWaitableTimer "
Отправлено Michelnok , 21-Янв-09 03:10 
>
>sleep() в цикле не подходит, потому что надо чтобы событие генерилось через
>строго опр. промежуток времени.

Судя по 10 сек в примере, не сильно-то и строго. Да и системы-то с разделением времени. Поэтому даже sleep вполне подходит, с предварительным вычислением, сколько реально надо спать, и надо ли спать вообще на данном шаге. Если нужны микросекунды, то вместо time/sleep можно использовать gettimeofday/usleep (или select).


"CreateWaitableTimer "
Отправлено from_mars , 21-Янв-09 06:20 
да ладно, пофег )
еще про libev нашел, с ее помощью тоже можно сделать.



"CreateWaitableTimer "
Отправлено vic , 21-Янв-09 12:06 
>да ладно, пофег )
>еще про libev нашел, с ее помощью тоже можно сделать.

setitimer() ?