gpt4 book ai didi

c++ - 高分辨率节目时间

转载 作者:太空狗 更新时间:2023-10-29 20:44:54 24 4
gpt4 key购买 nike

我目前正在用 C++ 编写俄罗斯方 block 程序。目前处于程序编写完成的阶段,但还需要修复一些bug和优化性能。

也就是说,我的程序中的一个缺陷是它每秒只能处理一次按键。我需要它来处理至少三个。您可以看到此代码演示的缺陷:

//Most headers only pertain to my main program.
#include <iostream>
#include <termios.h>
#include <pthread.h>
#include <time.h>
#include <cstring>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

using namespace std;

//Timer function.
void *Timer(void*) {

time_t time1, time2;

time1 = time(NULL);

while (time2 - time1 < 1) {
time2 = time(NULL);
}

pthread_exit(NULL);
}

int main() {

//Remove canonical buffering.
struct termios t_old, t_new;
tcgetattr(STDIN_FILENO, &t_old);
t_new = t_old;
t_new.c_lflag &= (~ICANON & ~ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &t_new);

const int STDIN = 0;

struct timeval tv, tv1;
fd_set readfds, readfds2, master;
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&readfds);
FD_ZERO(&master);
FD_SET(STDIN, &readfds);
FD_SET(STDIN, &master);
char buffer[1];

while(buffer[0] != 'q') {

pthread_t inputTimer;

pthread_create(&inputTimer, NULL, Timer, NULL);

readfds = master;

memcpy(&tv1, &tv, sizeof(tv));

if (select(STDIN+1, &readfds, NULL, NULL, &tv1) == -1) {
perror("select");
}
if (FD_ISSET(STDIN, &readfds)) {
buffer[0] = cin.get();
cout << "You entered: " << buffer << endl;

}

pthread_join(inputTimer, NULL);


cout << "Timed out.\n" << endl;

}

cout << "Game Over." << endl;

return 0;

}

如您所见,该程序通过设置一个一秒间隔的计时器和timeval 来运行。因为两个计时器都使用整数来确定经过了多长时间,所以它们不能比一秒更精确。如何修改我的程序以使其更精确?

我的想法是,如果按下某个键,则将 tv1 的值复制到第三个值,然后等待再次输入,但无论 tv1 是什么值时间。例如,如果我在只剩下半秒时按下一个键,值 0.5 将从 tv1 中获取并复制到另一个变量。然后程序将只等待半秒输入,而不是整秒。但是,这不起作用,因为 tv1 只等于 10

最佳答案

尝试使用 struct timevalgettimeofday() in sys/time.h。您可以达到微秒级分辨率。

联机帮助页:http://linux.die.net/man/3/gettimeofday

更多信息:http://www.gnu.org/software/libc/manual/html_node/Elapsed-Time.html

编辑:在 Linux 中(不可移植到 Windows 下的 MinGW),您还可以使用 poll()(请参阅 here),它可以让您等待几毫秒。这会更有效,因为 poll 会暂停线程执行,直到时间结束。

//Timer function.
void *Timer(void*) {
poll(0, 0, 100); //Suspend thread for 100 ms.
pthread_exit(NULL);
}

poll函数在poll.h中声明

关于c++ - 高分辨率节目时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12028543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com