1
私はZeroMQの初心者です。ZeroMQのSUB加入者は、ROSのように "コールバック"メカニズムを持っていますか?
私はよくROSを使用します。したがって私はZeroMQの加入者に混乱しています。ほとんどの場合、ROSでは、加入者はコールバック関数を持っています。コールバック関数は、データが対応する装飾体で利用可能なときはいつでも自動的に呼び出されます。
ROS wikiから借りコードスニペット、下記をご覧ください:
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
//define subscriber and callback function associated with it
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
しかし、ZeroMQで、以下に示すように、加入者は、データを受信するループ内に保持されているようです:
for (int update_nbr = 0; update_nbr < 100; update_nbr++)
{
zmq::message_t update;
int zipcode, temperature, relhumidity;
// receive the data
subscriber.recv(&update);
// do something with data
std::istringstream iss(static_cast<char*>(update.data()));
iss >> zipcode >> temperature >> relhumidity;
}
上記コードはZeroMQ wikiから借りています。
ROS加入者に似たコールバックメカニズムがZeroMQにも存在しますか?
:
私は頻繁にタイムアウトとこのようなパターンを使用します。 'zmq_socket.recv(&msg)'が同じメッセージを再び受信する可能性はありますか? 'while'ループが速すぎるか、それとも何かの可能性がありますか?それが意味をなさないかどうかわからない。 –
マルチパートメッセージを送信していないと仮定すると、1つのメッセージが送信された場合、1つのメッセージだけが受信されます。ループが速すぎることはありません。なぜなら、メッセージが受信されるか、タイムアウトに達するまで、 'recv'呼び出しをブロックするからです。 – Clonk
うん。もう1つの質問。 *購読者*がそれに接続されているかどうかを知ることができる方法はありますか?基本的には、私は*出版社*の仕事を中断して、* subscriber *が接続されたときにのみ再開できることを考えています。 –