如何循环一个函数,直到新的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
中进行阻塞呼叫(这是无限循环所做的),因为它必须返回以允许客户端继续接收消息。
如果您想要反复印刷邮件内容,直到收到新消息,则需要在单独的线程上完成。
嗨!如果在回调函数中有一个while循环,我认为回调不能接收新消息,或者我错了吗? – Janoshh
@Janoshh:这没有道理。当然,回调函数可以接收新消息,但一次只能接收一条消息。在完成第一条消息之前,它不能收到第二条消息。回调只在返回消息时完成。 – MSalters
@hardillb:是的,我的意思是:如果回调中存在一个while循环,则回调永远不会返回,因此它不会收到新消息。好吧,我有同样的想法,但线程是一个不好的解决方案,我认为可能会有更好的解决方案 – Janoshh