我的项目代码构造需要等待一段时间,但是当有中断(例如传入的udp数据包)时,它会离开此循环,执行某些操作,然后重新启动等待。
我该如何实现呢?我的第一个想法是使用while(wait(2000))
,但等待是一个无效的构造......
谢谢!
答案 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
}
}
}
here是select
的简单示例。
如果您正在查看多线程应用程序,尝试在两个线程之间进行通信,那么有几种选择。其中两个是:
使用与上面相同的机制。文件描述符是调用pipe的结果。休眠线程获取管道的读取端。正在唤醒的线程将结束写入,并在需要唤醒时写入一个字符。
使用C ++的std::condition_variable
。已记录here,并提供了完整的示例。此解决方案取决于您的上下文,例如,是否具有可以等待的变量或必须执行的操作。
其他中断也可以通过这种方式捕获。例如,信号具有signalfd。计时器事件具有timerfd。这在很大程度上取决于您的需求以及在什么环境下运行。例如,timerfd
是特定于Linux的。