2017-03-29 38 views
1

我正在用Paho在C++中編寫一個mqtt應用程序。我正在使用Paho.mqtt C庫,可以找到here如何循環一個函數,直到新的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); 
} 

上面的代碼不工作;我可以收到一條消息並在loopMessage函數中運行while循環。之後,客戶端斷開連接。我認爲這是因爲它處於阻塞模式,並且代理在保持活動時間間隔(我正在使用MQTTClient)後斷開客戶端連接。如果我在斷開連接之前快速發送新消息,則客戶端不會收到它。

我試圖使用asynchronus客戶端版本(MQTTAsync),但它給我同樣的問題。

有關如何做到這一點的任何建議?

回答

0

泛美衛生組織的客戶端將啓動一個線程來處理網絡環路,並收集新的消息,以便只是刪除loopMessage功能和打印郵件中的messageArrivedCallback

您不應該在messageArrivedCallback中進行阻塞呼叫(這是無限循環所做的),因爲它必須返回以允許客戶端繼續接收消息。

如果您想要反覆印刷郵件內容,直到收到新消息,則需要在單獨的線程上完成。

+0

嗨!如果在回調函數中有一個while循環,我認爲回調不能接收新消息,或者我錯了嗎? – Janoshh

+0

@Janoshh:這沒有道理。當然,回調函數可以接收新消息,但一次只能接收一條消息。在完成第一條消息之前,它不能收到第二條消息。回調只在返回消息時完成。 – MSalters

+0

@hardillb:是的,我的意思是:如果回調中存在一個while循環,則回調永遠不會返回,因此它不會收到新消息。好吧,我有同樣的想法,但線程是一個不好的解決方案,我認爲可能會有更好的解決方案 – Janoshh

相關問題