在C ++中每10毫秒执行一次函数

时间:2017-10-06 16:11:11

标签: c++ winapi time sleep

考虑:

#include <time.h>
#include <windows.h>

clock_t tStart = clock();
for (int i = 0; i < 10; i++) {
    Sleep(10);
}
printf("Time taken: %.3fs\n", (double)(clock() - tStart) / CLOCKS_PER_SEC);

所花费的时间:0.102秒(变化)

clock_t tStart = clock();
for (int i = 0; i < 10; i++) {
    doSomething();
    Sleep(10);
}
printf("Time taken: %.3fs\n", (double)(clock() - tStart) / CLOCKS_PER_SEC);

所用时间:0.105秒(变化)

如何调整睡眠()以使程序每次打印0.100秒时始终如一? (那个doSomething();恰好每0.010秒执行一次)。这甚至可能吗?

到目前为止,我已经尝试计算循环的每次迭代所花费的时间,并将该数量减少以下Sleep(),但无济于事。另外,如果每隔0.010秒执行某项操作是不可能的,那么我可以始终如一地执行某些操作的最短时间是多少?

1 个答案:

答案 0 :(得分:7)

我(以及我假设许多其他人)在游戏中使用的技术是绝对时间。这会自动调整操作的持续时间。

e.g。

#include <chrono>
#include <thread>
#include <iostream>

using namespace std::literals;
using clock_type = std::chrono::high_resolution_clock;

void doSomething() {}

int main()
{
    auto when_started = clock_type::now(); 
    auto target_time = when_started + 10ms;
    for (int i = 0; i < 10; i++) {
        doSomething();
        std::this_thread::sleep_until(target_time);
        target_time += 10ms;
    }
    auto now = clock_type::now();
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(now - when_started).count() << "ms\n";
}