2012-01-14 2 views
1

Мой проект - это сервер заданий, в котором хранятся команды, полученные UDP в очереди. Каждая команда имеет значение интервала, которое должно быть выполнено, и значение тайм-аута, которое нужно удалить. Эти действия контролируются таймером, который должен запускаться независимо от кода сервера, как 2 процесса.Как использовать сокеты и таймеры без блокировки друг друга?

Каков наилучший способ сделать сервер и таймер работать без блокировки друг друга? Я думаю о потоках или асинхронных вызовах, но я новичок в C++, и я не знаю, как применять эти идеи в моем коде.

Я использую Visual C++ 2010 и ASIO от Boost 1.48.

Спасибо!

+0

Threading - это одно из решений, но если вы можете гарантировать, что обработка ваших событий времени не займет слишком много времени, вы можете сделать все в одном потоке с помощью одного основного цикла и обработчиков сигналов. Однопоточное программирование намного проще, поэтому стоит рассмотреть ваши варианты. –

ответ

1

Вы можете запланировать асинхронный (без блокировки) deadline_timer с Boost, ASIO, как и представленные здесь: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/tutorial/tuttimer2.html

Я предполагаю, что вы используете ASIO для UDP связи уже (так как вы упомянули, и другое) - теперь это просто вопрос о планировании таймеров, которые вам нужны в вашем цикле событий, и все должно работать.

+0

В первый раз, когда я прочитал ответ, я не понял, что означает «планирование таймеров, которые вам нужны в цикле событий» означает, но, сравнивая код в ссылке, которую вы отправили с моим кодом, я понял, что это не ответственность моего кода для выполнения планирования. Если я не ошибаюсь, трюк заключался в том, чтобы подключить таймер к тому же io_service, который мой сервер подключается, и пусть io_service выполняет эту работу. Простое решение, которое можно было бы решить даже без вопроса. Благодаря! – MendelGusmao

0

Вы должны иметь возможность сделать это в одном потоке, используя «неблокирующий сокет» и вручную рассчитанный таймер (например, используя тики с момента запуска приложения, используемые в SDL), но это приведет к высокому использованию ЦП.

Несколько потоков звучат намного лучше, но есть несколько вариантов, как это сделать. Например: http://support.microsoft.com/kb/815805 или pthreads под linux.

Google для «многопоточного визуального C++ 2010» должен рассказать вам гораздо больше.

Смежные вопросы