Waiting for interrupt-loop
Waiting for interrupt-loop
我需要为我的项目等待一段时间的代码结构,但是当有中断时(例如传入udp数据包)它离开这个循环,做一些事情,并在此之后重新开始等待。
我该如何实现呢?我的第一个想法是使用while(wait(2000))
,但等待是一个无效的结构…
谢谢你!
我会将循环放入函数
void awesomeFunction() {
bool loop = true;
while (loop) {
wait(2000);
...
...
if (conditionMet)
loop = false;
}
}
然后我将把这个函数放入另一个循环
while (programRunning) {
awesomeFunction();
/* Loop ended, do stuff... */
}
从这个问题中有几件事我不清楚。这是一个多线程应用程序,其中一个线程处理(例如)UDP数据包,而另一个线程等待事件,或者这是单线程的?你也没有提到这是什么操作系统,这是相关的。因此,我将假设Linux,或支持轮询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
}
}
}
select
的一个简单例子可以在这里找到。
如果您正在查看一个多线程应用程序,试图在两个线程之间进行通信,那么有几个选项。其中两个是:
使用与上面相同的机制。文件描述符是调用pipe的结果。正在睡觉的线程获得管道的读端。正在唤醒的线程得到写端,并在该唤醒时写入一个字符。
使用c++的
std::condition_variable
。这里记录了它,并提供了一个完整的示例。这个解决方案取决于你的上下文,例如,你是否有一个可以等待的变量,或者你必须做什么。
其他中断也可以用这种方式捕获。例如,信号有一个signalfd。定时器事件有timerfd。这在很大程度上取决于您需要什么,以及在什么环境中运行。例如,timerfd
是linux特有的。
相关文章:
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- "Ill-defined for-loop - loop executes infinitely" (MSVC C6295)
- For-loop或std::any_of,我应该使用哪一个?
- 在"for loop"中使用GOTOXY定位
- 在这种情况下,我将如何继续 1 到 360 的"for loop"处理指针和地址?
- C++ For Loop在过程中被跳过了.如何解决?
- 如何增加"for loop"呈现的结果?
- for(;;) vs do..while() for main program loop
- 在C 中,如何在使用for loop的整数中找到所有连续的复合编号
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- Bjarne Stroustrup Book - Vector and For loop - 将不起作用
- OpenCV cv::Mat "+=" inside for loop
- exc_bad_access on for loop(数组功能指针)
- For-Loop帮助获得错误的输出
- "Do not change a loop variable inside a for loop block"的意义是什么?
- paralelizing for loop with inequality (openmp c++)
- 是否可以对用户输入进行"loop interrupt"?
- Cplex c++ loop for
- Waiting for interrupt-loop