等待中断循环

时间:2014-03-25 14:04:01

标签: c++

我的项目代码构造需要等待一段时间,但是当有中断(例如传入的udp数据包)时,它会离开此循环,执行某些操作,然后重新启动等待。
我该如何实现呢?我的第一个想法是使用while(wait(2000)),但等待是一个无效的构造......
谢谢!

2 个答案:

答案 0 :(得分:0)

我会把循环放在一个函数

void awesomeFunction() {
    bool loop = true;

    while (loop) {
        wait(2000);
        ...
        ...
        if (conditionMet)
            loop = false;
    }
}

然后我会把这个函数放在另一个循环中

while (programRunning) {
    awesomeFunction();

    /* Loop ended, do stuff... */
}

答案 1 :(得分:0)

有些问题我不清楚。这是一个多线程应用程序,其中一个线程处理(例如)UDP数据包,另一个线程等待事件,或者是单线程?您也没有提到这是什么操作系统,这是相关的。因此,我将假设使用Linux或支持poll API的某种软件或类似软件(例如select)。

让我们假设一个等待UDP数据包的单线程应用程序。主要思想是,一旦有了套接字的文件描述符,对poll的调用就会有无限循环。例如:

#include <poll.h>
// ...
void handle_packets() {
  // m_fd was created with `socket` and `bind` or `connect`.
  struct pollfd pfd = {.fd = m_fd, .events = POLLIN};
  int timeout;
  timeout = -1; // Wait indefinitely
  // timeout = 2000; // Wait for 2 seconds
  while (true) {
    pfd.revents = 0;
    poll(&pfd, 1, timeout);
    if ((pfd.revents & POLLIN) != 0) {
      handle_single_packet();  // Method to actually read and handle the packet
    }
    if ((pfd.revents & (POLLERR | POLLHUP)) != 0) {
      break; // return on error or hangup
    }
  }
}

hereselect的简单示例。


如果您正在查看多线程应用程序,尝试在两个线程之间进行通信,那么有几种选择。其中两个是:

  1. 使用与上面相同的机制。文件描述符是调用pipe的结果。休眠线程获取管道的读取端。正在唤醒的线程将结束写入,并在需要唤醒时写入一个字符。

  2. 使用C ++的std::condition_variable。已记录here,并提供了完整的示例。此解决方案取决于您的上下文,例如,是否具有可以等待的变量或必须执行的操作。

其他中断也可以通过这种方式捕获。例如,信号具有signalfd。计时器事件具有timerfd。这在很大程度上取决于您的需求以及在什么环境下运行。例如,timerfd是特定于Linux的。