如何循环一个函数,直到新的mqtt消息到达?

问题描述:

我正在用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),但它给我同样的问题。

有关如何做到这一点的任何建议?

泛美卫生组织的客户端将启动一个线程来处理网络环路,并收集新的消息,以便只是删除loopMessage功能和打印邮件中的messageArrivedCallback

您不应该在messageArrivedCallback中进行阻塞呼叫(这是无限循环所做的),因为它必须返回以允许客户端继续接收消息。

如果您想要反复印刷邮件内容,直到收到新消息,则需要在单独的线程上完成。

+0

嗨!如果在回调函数中有一个while循环,我认为回调不能接收新消息,或者我错了吗? – Janoshh

+0

@Janoshh:这没有道理。当然,回调函数可以接收新消息,但一次只能接收一条消息。在完成第一条消息之前,它不能收到第二条消息。回调只在返回消息时完成。 – MSalters

+0

@hardillb:是的,我的意思是:如果回调中存在一个while循环,则回调永远不会返回,因此它不会收到新消息。好吧,我有同样的想法,但线程是一个不好的解决方案,我认为可能会有更好的解决方案 – Janoshh