В венде есть ф-я CreateWaitableTimer, которая создает таймер, который затем можно использовать в каком-нить потоке, в одной из WaitFor-функций. Т.е. поток ожидает события от таймера, просыпается по событию, делает свои дела, снова засыпает в ожидании события от таймера. Не важно, успел ли поток сделать свои дела до следующей сработки таймера, таймер стабильно будет сигналить в заданном интервале, это я к тому, что обычный sleep() не подойдет :)Вопрос в том, как такое организовать в *никсах, в многопоточной проге? )
>В венде есть ф-я CreateWaitableTimer, которая создает таймер, который затем можно использовать
>в каком-нить потоке, в одной из WaitFor-функций. Т.е. поток ожидает события
>от таймера, просыпается по событию, делает свои дела, снова засыпает в
>ожидании события от таймера. Не важно, успел ли поток сделать свои
>дела до следующей сработки таймера, таймер стабильно будет сигналить в заданном
>интервале, это я к тому, что обычный sleep() не подойдет :)
>
>
>Вопрос в том, как такое организовать в *никсах, в многопоточной проге? )
>А вопрос конкретно в чем?
"Вопрос в том, как ТАКОЕ организовать в *никсах, в многопоточной проге?"
или
"Вопрос в том, как такое ОРГАНИЗОВАТЬ в *никсах, в многопоточной проге?"Тоесть шашечки или ехать? :)
Да вроде бы разобрался :) Нужно было следущее:
Есть многопоточная прога, нужно, чтобы один из потоков, через определенный переиод времени, получал сигнал (ну обязательно *никс сигнал, а просто сигнал, о событии), от которого этот поток просыпался, делал свое дело и дальше спать.
sleep() в цикле не подходит, потому что надо чтобы событие генерилось через строго опр. промежуток времени.В венде это можно сделать так:
//не важно в каком потоке
...
hTimer = CreateWaitableTimer();
SetWaitableTimer(hTimer, 10 секунд);
...//в одном из потоков
while(1) {
WaitForSingleObject(hTimer);
do_some_code(); // мы не знаем сколько времени займет выполнение кода
// если код будет выполнятся дольше 10 сек, то след. вызов WaitForSingleObject(hTimer)
// сразу же вернет управление, т.к. событие уже сгенерилось и ждет когда его заметят :)
// поэтому поток не уйдет в спячку, а опять перейдет к do_some_code(). Вот почему
// sleep() не подходит.
}В *никсах это можно организовать с помощью timer_create() и sigsuspend(). Или может как-то с помощью SDL. А может еще как-то :)
>
>sleep() в цикле не подходит, потому что надо чтобы событие генерилось через
>строго опр. промежуток времени.Судя по 10 сек в примере, не сильно-то и строго. Да и системы-то с разделением времени. Поэтому даже sleep вполне подходит, с предварительным вычислением, сколько реально надо спать, и надо ли спать вообще на данном шаге. Если нужны микросекунды, то вместо time/sleep можно использовать gettimeofday/usleep (или select).
да ладно, пофег )
еще про libev нашел, с ее помощью тоже можно сделать.
>да ладно, пофег )
>еще про libev нашел, с ее помощью тоже можно сделать.setitimer() ?