2016-12-16 4 views
1

Я использую asio (только автономный заголовок) в пределах Qt Быстрое приложение.QTimer с asio :: io_service.poll_one() или poll()

Поскольку Qt и asio имеют свой собственный цикл событий, если я правильно понял, я использую сигнал QTimer для вызова класса, содержащего мой объект asio::io_service.

QTimer *timer_io = new QTimer(); 
QObject::connect(timer_io, SIGNAL(timeout()), &my_INandOUT, SLOT(poll_ios())); 
timer_io->start(IO_TIMER); 

Я установил IO_TIMER в 100 мс. Я прочитал в документации, что после каждого poll() необходимо вызывать asio::io_service.reset(). Таким образом, слот poll_ios() имеет следующий код:

void INandOUT::poll_ios() 
{ 
    // qDebug() << "poll_io signal"; 
    m_io_service.poll_one(); 
    m_io_service.reset(); 

} 

является то, что правильный способ вызова reset()? Или я должен вызвать его в каждом обработчике, как только они закончат свою задачу? Это безопасно или я могу потерять asio событий?

ответ

0

Было бы проще и легче потерять asio события и использовать Qt встроенные классы вместо: например: QNetworkAccessManager или QUdpSocket.

Однако вызов poll_one или poll из таймера (как вы это сделали) является обычным способом использования asio с внешним циклом событий.

Но я не рекомендую вызова reset после вызова poll_one, так как согласно документации она должна быть названа только:

когда предыдущий вызов этих функций, возвращенных из-за io_service остановки или на исходе от работы

Если вы снова включите обработчики asio (например, включив обработчик приема после получения сообщения), то io_service всегда имеет работу. В этом случае было бы лучше просто позвонить poll вместо poll_one и потерять вызов reset, например:

void INandOUT::poll_ios() 
{ 
    // qDebug() << "poll io signal"; 
    m_io_service.poll(); 
} 
+0

Первое, что я делаю с 'asio' является' async_connect', и мой обработчик никогда не возвращается если я не использую 'm_io_service.reset()'. Спасибо, я посмотрю на QNetworkAccessManager. – jmatthieu

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

  • Нет связанных вопросов^_^