2016-12-16 20 views
1

私はQtクイックアプリケーション内asio(のみスタンドアロンヘッダ)を使用しています。ASIOとQTimer :: io_service.poll_one()やpoll()

正しく理解すれば、Qtとasioはそれぞれ独自のイベントループを持っているため、私はasio::io_serviceオブジェクトを保持するクラスを呼び出すためにQTimerシグナルを使用します。

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

IO_TIMERを100ミリ秒に設定しました。私はasio::io_service.reset()がそれぞれpoll()の後に呼び出されなければならないことを文書で読みました。だから、スロットpoll_ios()は、次のコードを持っています

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

} 

は正しい方法はreset()をコールすることですか?あるいは、彼らは彼らの仕事を終えたら、各ハンドラでそれを呼びますか?それは安全か、私は緩めることができるasioイベント?

答えて

0

asioイベントを失うことはなく、Qtの組み込みクラスを代わりに使用すると簡単になります。たとえば、またはQUdpSocketです。

ただし、外部イベントループでasioを使用する通常の方法は、タイマーからpoll_oneまたはpollを呼び出すことです。

しかし、私はそれだけ呼ばれるべきマニュアルに従って以来poll_oneを呼び出した後resetを呼び出すことはお勧めしません: 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