Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在启动另一个计时器之前等待20秒的非阻塞计时器_C++_Linux_Timer - Fatal编程技术网

C++ 在启动另一个计时器之前等待20秒的非阻塞计时器

C++ 在启动另一个计时器之前等待20秒的非阻塞计时器,c++,linux,timer,C++,Linux,Timer,我想在线程启动20秒后打开计时器。如何在不阻止执行的情况下执行此操作 所以我的线程输入函数是ThreadInAction。我想等待20秒,然后从ThreadInAction启动计时器,但我不想使用sleep或其他方法阻止此线程。 我们怎么做 void* ThreadInAction() { //code } 创建第一个计时器,该计时器将在20秒后生成函数调用,并让此计时器创建另一个计时器。您的函数必须在这20秒期间或休眠期间执行某些操作。如果你不想让它睡眠,你可以在循环中轮询时间,

我想在线程启动20秒后打开计时器。如何在不阻止执行的情况下执行此操作

所以我的线程输入函数是ThreadInAction。我想等待20秒,然后从ThreadInAction启动计时器,但我不想使用sleep或其他方法阻止此线程。 我们怎么做

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;
}