C++ 在启动另一个计时器之前等待20秒的非阻塞计时器
我想在线程启动20秒后打开计时器。如何在不阻止执行的情况下执行此操作 所以我的线程输入函数是ThreadInAction。我想等待20秒,然后从ThreadInAction启动计时器,但我不想使用sleep或其他方法阻止此线程。 我们怎么做C++ 在启动另一个计时器之前等待20秒的非阻塞计时器,c++,linux,timer,C++,Linux,Timer,我想在线程启动20秒后打开计时器。如何在不阻止执行的情况下执行此操作 所以我的线程输入函数是ThreadInAction。我想等待20秒,然后从ThreadInAction启动计时器,但我不想使用sleep或其他方法阻止此线程。 我们怎么做 void* ThreadInAction() { //code } 创建第一个计时器,该计时器将在20秒后生成函数调用,并让此计时器创建另一个计时器。您的函数必须在这20秒期间或休眠期间执行某些操作。如果你不想让它睡眠,你可以在循环中轮询时间,
void* ThreadInAction()
{
//code
}
创建第一个计时器,该计时器将在20秒后生成函数调用,并让此计时器创建另一个计时器。您的函数必须在这20秒期间或休眠期间执行某些操作。如果你不想让它睡眠,你可以在循环中轮询时间,直到20秒过去 例如: 在下面的代码中,假设
getTime()
以毫秒为单位返回当前时间(可能是启动计算机后经过的时间,也可能是定义的日期和时间)
#定义二十秒周期20000
void*ThreadInAction()
{
int initTime=getTime();
而((getTime()-initTime)<20秒周期)
{
//无所事事
}
//你的代码
}
与getTime()等价的是操作系统、库或标准库提供的一些API。请查看,您可以为SIGALRM注册一个信号处理程序,如下所示
sigaction(SIGALRM,struct_sigaction,NULL)
其中,struct\u sigaction
有一个成员sa\u handler
,它将指向您的信号处理函数
现在使用
设置定时器创建定时器。将计时器设置为20秒。这个小例子应该是可移植的
当然,在实际的应用程序中,您可能希望做一些比打印消息更明智的事情,线程的主体可能希望继续进行一些工作(同时可能轮询事件,以便它知道计时器何时关闭)
请注意,信号处理程序仅在代码中的特定点被调用-作为一般规则,您可以假定它们将中断系统调用(在本例中,底层的nanosleep()
调用std::this_thread::sleep_for
。但是,为了避免意外,值得查看文档
对于由多个高分辨率(ish)计时器组成的更为复杂的系统,有从sys/time.h
以下是一些参考链接:
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <thread>
using namespace std;
void alarm_handler(int i)
{
cout << "alarm signalled " << i << endl;
}
int main()
{
struct sigaction alarm_action;
memset(&alarm_action, sizeof(alarm_action), 0);
alarm_action.sa_handler = &alarm_handler;
alarm_action.sa_flags = 0;
alarm_action.sa_mask = 0;
sigaction(SIGALRM, &alarm_action, nullptr);
alarm(2);
cout << "waiting " << endl;
auto t0 = chrono::high_resolution_clock::now();
this_thread::sleep_for(chrono::seconds(10));
auto t1 = chrono::high_resolution_clock::now();
auto diff = chrono::duration_cast<chrono::milliseconds>(t1-t0);
cout << "signalled after " << diff.count() << " milliseconds" << endl;
return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
无效报警处理程序(int i)
{
但我希望我的代码执行该执行流中的其他任务,而不是在逻辑上检查是否已过20秒。也就是说,我希望它执行我的代码或“//您的代码”在这20秒内完成。所以我误解了你的问题>我假设你在linux系统上工作。setitimer
设置POSIX定时器,所以Unix系统和linux一样支持POSIX定时器。虽然boost::asio定时器回调是异步调用的,但你仍然需要调用ioservice::run()如果应用程序设计限制阻塞调用,则必须在单独的线程上调用ioservice::run()。
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <thread>
using namespace std;
void alarm_handler(int i)
{
cout << "alarm signalled " << i << endl;
}
int main()
{
struct sigaction alarm_action;
memset(&alarm_action, sizeof(alarm_action), 0);
alarm_action.sa_handler = &alarm_handler;
alarm_action.sa_flags = 0;
alarm_action.sa_mask = 0;
sigaction(SIGALRM, &alarm_action, nullptr);
alarm(2);
cout << "waiting " << endl;
auto t0 = chrono::high_resolution_clock::now();
this_thread::sleep_for(chrono::seconds(10));
auto t1 = chrono::high_resolution_clock::now();
auto diff = chrono::duration_cast<chrono::milliseconds>(t1-t0);
cout << "signalled after " << diff.count() << " milliseconds" << endl;
return 0;
}