2017-03-29 4 views
1

私はPahoでC++でmqttアプリケーションを書いています。私はhereであるPaho.mqtt Cライブラリを使用しています。新しいmqttメッセージが到着するまで関数をループする方法はありますか?

コールバック関数でメッセージを受け取ったときに、別の関数を呼び出してメッセージを出力します。私は新しいメッセージが到着するまでその機能をループすることができるようにしたい。

bool start = false; 
void loopMessage(std::string message){ 
    start = true; 
    while(start){ 
     std::out << "message: " << message; 
    } 
} 
int messageArrivedCallback(mqtt message){ 
    start = false; 
    loopMessage(message); 
} 

上記のコードは機能しません。私は1つのメッセージを受信し、loopMessage関数でwhileループを実行できます。その後、クライアントは切断されます。私はこれがブロッキング・モードにあり、ブローカが(MQTTClientを使用している)キープ・アライブ・インターバル後にクライアントを切断するためだと思います。切断する前にすばやく新しいメッセージを送信すると、クライアントはメッセージを受信しません。

私は非同期クライアント・バージョン(MQTTAsync)を使用しようとしましたが、同じ問題が発生しています。

これを行う方法に関するご提案はありますか?

答えて

0

Pahoクライアントは、ネットワークループを処理して新しいメッセージを収集するスレッドを開始するので、loopMessage関数を削除してmessageArrivedCallbackのメッセージを出力してください。

messageArrivedCallbackでは、クライアントがメッセージを引き続き受信できるようにする必要があるため、ブロッキングコール(この無限ループが行うことです)を行うべきではありません。

新しいメッセージが到着するまでメッセージの内容を何度も印刷する場合は、別のスレッドで行う必要があります。

+0

こんにちは!コールバック関数にwhileループがあると、コールバックが新しいメッセージを受け取ることができないと思いますか、間違っていますか? – Janoshh

+0

@ヤノシュ:それは意味をなさない。もちろん、コールバック関数は新しいメッセージを受信できますが、一度に1つのメッセージしか受信できません。最初のメッセージで完了するまで、2番目のメッセージを受信することはできません。コールバックは、返されたときにのみメッセージで終了します。 – MSalters

+0

@ hardillb:はい、私は意味しています:コールバックにwhileループがある場合、コールバックは決して戻ってこないので、新しいメッセージを受け取ることはできません。私は同じアイデアを持っていたが、スレッディングは大部分が悪い解決策であり、より良いものがあるかもしれないと思っていた – Janoshh

関連する問題