Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проверка на событие


Автор: isergey 13.5.2009, 18:05
В общем событием назовем какое-либо условие, которое настанет через некоторое время.

Допустим, событием может быть условие, что в некоторой очереди есть содержимое, или же настал некоторой момент времени, например 12:00. Случаев много. 

Одним из решений данной проблемы является циклический вызов функции проверки(неважно в основной программе или в отдельном потоке):
Код

while(1) {
    //Проверка: если очередь не пуста, отсылаем ее содержимое
    if(query != empty) send(query);
}

Такая проверка плоха тем, что она грузит процессор.

Проблема загрузки процессора решается путем вставки в тело цикла системного вызова sleep():
Код

while(1) {
    //Проверка: если очередь не пуста, отсылаем ее содержимое
    if(query != empty) send(query);
    sleep(1);
}

Это тоже плохо. Во-первых, непонятно на сколько уснет процесс(поток), во-вторых, при вызове sleep() поток может усыпить и основную программу, например в виндовсе засыпает только поток вызвавший sleep(), в то время на unix засыпает весть процесс.


Хотелось бы узнать, как изящно решить эту проблему. У меня есть идеи по этому поводу, но хотелось бы узнать ваше мнение.

Автор: Rififi 13.5.2009, 19:47
В схожей задаче делал именно так:
Код
int interval = 1min;
while (true)
{
   wait(interval || exit_event);
   if (exit_event)
      return;
   if (CheckTime())
      Do();
   interval = adjust_interval();
}


... на unix засыпает весть процесс ...
думаю, должен быть какой-нибудь workaround, потому что такое поведение - это полный бред.

Автор: xvr 14.5.2009, 11:31
Для этого есть thread'ы и примитивы синхронизации, такие как Event, Semaphore, Conditional Variable. В разных системах это обзывается по разному (и имеет разный API), но суть одна. Еще можно покопать в boost'е - там как в Греции, все есть  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)