在C语言中使用计时器的方法是什么?我需要等待500毫秒来执行一个任务。请提供任何好的方法来完成这个任务。我曾经使用过sleep(3);
,但这种方法在此时间段内不起作用。我有一些代码会在此期间尝试获取任何输入。
在C语言中使用计时器的方法是什么?我需要等待500毫秒来执行一个任务。请提供任何好的方法来完成这个任务。我曾经使用过sleep(3);
,但这种方法在此时间段内不起作用。我有一些代码会在此期间尝试获取任何输入。
这是我使用的解决方案(它需要 #include <time.h>
):
int msec = 0, trigger = 10; /* 10ms */
clock_t before = clock();
do {
/*
* Do something to busy the CPU just here while you drink a coffee
* Be sure this code will not take more than `trigger` ms
*/
clock_t difference = clock() - before;
msec = difference * 1000 / CLOCKS_PER_SEC;
iterations++;
} while ( msec < trigger );
printf("Time taken %d seconds %d milliseconds (%d iterations)\n",
msec/1000, msec%1000, iterations);
CLOCKS_PER_SEC
是什么? - mLstudent33time_t
结构和 clock()
函数。clock()
将开始时间存储在 time_t
结构中,并通过比较存储时间和当前时间之间的差异来检查经过的时间。是的,你需要一个循环。如果你已经有了一个主循环(大多数GUI事件驱动程序都有),你可能可以将计时器放入其中。使用:
#include <time.h>
time_t my_t, fire_t;
然后(超过1秒的时间),通过读取当前时间来初始化您的计时器:
my_t = time(NULL);
在计时器等待的秒数上添加数字并将其存储在fire_t中。time_t本质上是一个uint32_t,您可能需要进行强制类型转换。
在您的循环内执行另一个操作
my_t = time(NULL);
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
/*
Implementation simple timeout
Input: count milliseconds as number
Usage:
setTimeout(1000) - timeout on 1 second
setTimeout(10100) - timeout on 10 seconds and 100 milliseconds
*/
void setTimeout(int milliseconds)
{
// If milliseconds is less or equal to 0
// will be simple return from function without throw error
if (milliseconds <= 0) {
fprintf(stderr, "Count milliseconds for timeout is less or equal to 0\n");
return;
}
// a current time of milliseconds
int milliseconds_since = clock() * 1000 / CLOCKS_PER_SEC;
// needed count milliseconds of return from this timeout
int end = milliseconds_since + milliseconds;
// wait while until needed time comes
do {
milliseconds_since = clock() * 1000 / CLOCKS_PER_SEC;
} while (milliseconds_since <= end);
}
int main()
{
// input from user for time of delay in seconds
int delay;
printf("Enter delay: ");
scanf("%d", &delay);
// counter downtime for run a rocket while the delay with more 0
do {
// erase the previous line and display remain of the delay
printf("\033[ATime left for run rocket: %d\n", delay);
// a timeout for display
setTimeout(1000);
// decrease the delay to 1
delay--;
} while (delay >= 0);
// a string for display rocket
char rocket[3] = "-->";
// a string for display all trace of the rocket and the rocket itself
char *rocket_trace = (char *) malloc(100 * sizeof(char));
// display trace of the rocket from a start to the end
int i;
char passed_way[100] = "";
for (i = 0; i <= 50; i++) {
setTimeout(25);
sprintf(rocket_trace, "%s%s", passed_way, rocket);
passed_way[i] = ' ';
printf("\033[A");
printf("| %s\n", rocket_trace);
}
// erase a line and write a new line
printf("\033[A");
printf("\033[2K");
puts("Good luck!");
return 0;
}
$ gcc timeout.c -o timeout && ./timeout && rm timeout
请尝试自行运行以查看结果。
注:
测试环境
$ uname -a
Linux wlysenko-Aspire 3.13.0-37-generic #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
for (i = 0; i <= 40; i++) {
进行了更改,现在一切都正常工作了 :3 - timob256