我想在线程启动20秒后打开计时器。如何在不阻止执行的情况下执行此操作。
所以我的线程入口函数是ThreadInAction。我想在从ThreadInAction启动计时器之前等待20秒,但我不想使用sleep或任何东西阻止此线程。 我们怎么做?
void* ThreadInAction()
{
//code
}
答案 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。