【发布时间】:2020-06-08 06:27:53
【问题描述】:
我正在做一个必须使用 zmq_poll 的项目。但我并没有完全理解它的作用。
所以我也尝试实现:
zmq_pollitem_t timer_open(void){
zmq_pollitem_t items[1];
if( items[0].socket == nullptr ){
printf("error socket %s: %s\n", zmq_strerror(zmq_errno()));
return;
}
else{
items[0].socket = gsock;
}
items[0].fd = -1;
items[0].events = ZMQ_POLLIN;
// get a timer
items[0].fd = timerfd_create( CLOCK_REALTIME, 0 );
if( items[0].fd == -1 )
{
printf("timerfd_create() failed: errno=%d\n", errno);
items[0].socket = nullptr;
return;
}
int rc = zmq_poll(items,1,-1);
if(rc == -1){
printf("error poll %s: %s\n", zmq_strerror(zmq_errno()));
return;
}
else
return items[0];
}
我对这个主题很陌生,我必须修改一个旧的现有项目并将功能替换为 zmq 的功能。在其他网站上,我看到了他们在无限循环中使用两个项目和 zmq_poll 函数的示例。我已经阅读了文档,但仍然无法正确理解它是如何工作的。这些是我实现的另外两个功能。我不知道这是否是这样实现它的正确方法:
void timer_set(zmq_pollitem_t items[] , long msec, ipc_timer_mode_t mode ) {
struct itimerspec t;
...
timerfd_settime( items[0].fd , 0, &t, NULL );
}
void timer_close(zmq_pollitem_t items[]){
if( items[0].fd != -1 )
close(items[0].fd);
items[0].socket = nullptr;
}
我不确定是否需要 zmq_poll 函数,因为我正在使用计时器。
编辑:
void some_function_timer_example() {
// We want to wait on two timers
zmq_pollitem_t items[2] ;
// Setup first timer
ipc_timer_open_(&items[0]);
ipc_timer_set_(&items[0], 1000, IPC_TIMER_ONE_SHOT);
// Setup second timer
ipc_timer_open_(&items[1]);
ipc_timer_set_(&items[1], 1000, IPC_TIMER_ONE_SHOT);
// Now wait for the timers in a loop
while (1) {
//ipc_timer_set_(&items[0], 1000, IPC_TIMER_REPEAT);
//ipc_timer_set_(&items[1], 5000, IPC_TIMER_REPEAT);
int rc = zmq_poll (items, 2, -1);
assert (rc >= 0); /* Returned events will be stored in items[].revents */
if (items [0].revents & ZMQ_POLLIN) {
// Process task
std::cout << "revents: 1" << std::endl;
}
if (items [1].revents & ZMQ_POLLIN) {
// Process weather update
std::cout << "revents: 2" << std::endl;
}
}
}
现在它的打印速度仍然非常快,无需等待。它仍然只是在开始等待。并且当 timer_set 在循环内时,它会正确等待,前提是等待时间相同:ipc_timer_set(&items[1], 1000,...) and ipctimer_set(&items[0], 1000,...)
那么我该如何改变呢?或者这是正确的行为?
【问题讨论】:
标签: c++ c sockets timer zeromq