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

时间:2015-05-13 07:31:28

标签: c++ linux timer

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

所以我的线程入口函数是ThreadInAction。我想在从ThreadInAction启动计时器之前等待20秒,但我不想使用sleep或任何东西阻止此线程。 我们怎么做?

void* ThreadInAction()
{
     //code

}

5 个答案:

答案 0 :(得分:2)

您可以为SIGALRM注册信号处理程序,如下所示。

<table id="tblClaimSearch" class="display responsive nowrap" cellspacing="0" width="100%">
    <thead>
       <tr>
          <th><input type="checkbox" id="ChkboxClaimHeader" name="ChkboxClaimHeader" value="false"></th>
          <th>Claim #</th>
          <th>Client Name</th>
          <th>Amount</th>
          <th>Deduction</th>
          <th>Type</th>
          <th>Status</th>
       </tr>
    </thead>
    <tbody>                      

    </tbody>
 </table> 

其中$(document).ready(function () { $.ajax({ url: '@Url.Action("ClaimResultTest", "Claims")', data: { seacrhClaimNumber: claimNumberToBeSearched }, type: 'POST', success: function (data) { var dataClaims = data.Claims;//This has the complete list for (i = 0; i < dataClaims.length; i++) { alert(dataClaims[i].ClaimNumber); $("#tblClaimSearch").find('tbody') .append($('<tr>') .append($('<td><input type="checkbox">')) .append($('<td>').text(dataClaims[i].ClaimNumber)) .append($('<td>').text(dataClaims[i].Client)) .append($('<td>').text(dataClaims[i].Amount)) .append($('<td>').text(dataClaims[i].Deduction)) .append($('<td>').text(dataClaims[i].Type)) .append($('<td>').text(dataClaims[i].Status)) ) } } }); }); 有一个成员sigaction(SIGALRM,struct_sigaction,NULL) ,它将指向您的信号处理函数。

现在使用struct_sigaction创建计时器。将计时器设置为20秒。

答案 1 :(得分:1)

创建第一个计时器,在20秒后生成一个函数调用,让这个计时器创建另一个计时器。

答案 2 :(得分:1)

这个小例子应该是合理的便携式。

当然,在一个真实的应用程序中,你想做一些比打印消息更明智的事情,并且线程的主体想要继续进行一些工作(同时可能轮询事件以便它知道何时计时器已经关闭了。)

请注意,信号处理程序仅在代码中的特定点调用 - 作为一般规则,您可以假设它们将中断系统调用(在本例中为nanosleep()中的基础std::this_thread::sleep_for调用。但是,为了避免意外,值得查看文档。

对于一个更精细的多个高(ish)分辨率计时器系统,setitimer

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

控制定时器发出信号时要采取的操作: http://man7.org/linux/man-pages/man2/sigaction.2.html

使用间隔定时器链进行信令: http://linux.die.net/man/2/setitimer

预定报警电话的简单信令: http://linux.die.net/man/2/alarm

答案 3 :(得分:0)

答案 4 :(得分:-1)

你的功能必须在这20秒的时间内做某事或睡觉。如果你不想让它睡觉,你可以循环轮询时间,直到20秒过去。

例如: 在以下代码中,假设getTime()以毫秒为单位返回当前时间(可能是自您启动计算机以来或自定义的日期和时间以来经过的时间)。

#define TWENTY_SECONDS_PERIOD 20000

void* ThreadInAction()
{
   int initTime = getTime();
   while((getTime() - initTime) < TWENTY_SECONDS_PERIOD)
   {
      //do nothing
   }

   //your code
}

等效于getTime()的是您的操作系统,库或标准库提供的API。