本例以40ms为周期调用接口
#include <iostream>
#include <chrono>
#include <thread>
#include <functional>
uint64_t systemTimeUS()
{
using namespace std::chrono;
time_point<system_clock, microseconds> nowus = time_point_cast<microseconds>(system_clock::now());
return static_cast<uint64_t>(nowus.time_since_epoch().count());
}
uint64_t systemTimeMS()
{
using namespace std::chrono;
time_point<system_clock, milliseconds> nowus = time_point_cast<milliseconds>(system_clock::now());
return static_cast<uint64_t>(nowus.time_since_epoch().count());
}
void doAction()
{
printf("[work] time: [%lu]ms\n", systemTimeMS());
std::this_thread::sleep_for(std::chrono::milliseconds(7));
}
void doAction_20ms()
{
printf("[work] time: [%lu]ms\n", systemTimeMS());
std::this_thread::sleep_for(std::chrono::milliseconds(20));
}
void doAction_40ms()
{
printf("[work] time: [%lu]ms\n", systemTimeMS());
std::this_thread::sleep_for(std::chrono::milliseconds(40));
}
void doAction_0ms()
{
printf("[work] time: [%lu]ms\n", systemTimeMS());
// std::this_thread::sleep_for(std::chrono::milliseconds(20));
}
void doAction_50ms()
{
printf("[work] time: [%lu]ms\n", systemTimeMS());
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
void test1();
void test2();
void test3();
void test4();
void test5();
using funcAction = std::function<void ()>;
void test(funcAction func);
int main()
{
test1();
test2();
test3();
test4();
test5();
std::cout << "=======================================" << std::endl;
test(&doAction);
test(&doAction_0ms);
test(&doAction_20ms);
test(&doAction_40ms);
test(&doAction_50ms);
// {
// uint64_t starttime = systemTimeUS();
// printf("[main] now system time: [%lu]us\n", starttime);
// }
// {
// uint64_t starttime = systemTimeUS();
// printf("[main] now system time: [%lu]us\n", starttime);
// }
// {
// uint64_t starttime = systemTimeUS();
// printf("[main] now system time: [%lu]us\n", starttime);
// }
// {
// uint64_t starttime = systemTimeUS();
// printf("[main] now system time: [%lu]us\n", starttime);
// }
return 0;
}
void test(funcAction func)
{
uint64_t starttime = systemTimeMS();
printf("[main] now system time: [%lu]ms\n", starttime);
func();
uint64_t finishtime = systemTimeMS();
int64_t waittime = starttime + 40 - finishtime;
if (waittime > 0 && waittime <= 40) {
std::this_thread::sleep_for(std::chrono::milliseconds(waittime));
}
doAction();
}
void test1()
{
uint64_t starttime = systemTimeUS();
printf("[main] now system time: [%lu]us\n", starttime);
doAction();
uint64_t finishtime = systemTimeUS();
int64_t waittime = starttime + 40 * 1000 - finishtime;
if (waittime > 0 && waittime <= 40 * 1000) {
std::this_thread::sleep_for(std::chrono::microseconds(waittime));
}
doAction();
}
void test2()
{
uint64_t starttime = systemTimeUS();
printf("[main] now system time: [%lu]us\n", starttime);
doAction_20ms();
uint64_t finishtime = systemTimeUS();
int64_t waittime = starttime + 40 * 1000 - finishtime;
if (waittime > 0 && waittime <= 40 * 1000) {
std::this_thread::sleep_for(std::chrono::microseconds(waittime));
}
doAction();
}
void test3()
{
uint64_t starttime = systemTimeUS();
printf("[main] now system time: [%lu]us\n", starttime);
doAction_0ms();
uint64_t finishtime = systemTimeUS();
int64_t waittime = starttime + 40 * 1000 - finishtime;
if (waittime > 0 && waittime <= 40 * 1000) {
std::this_thread::sleep_for(std::chrono::microseconds(waittime));
}
doAction();
}
void test4()
{
uint64_t starttime = systemTimeUS();
printf("[main] now system time: [%lu]us\n", starttime);
doAction_40ms();
uint64_t finishtime = systemTimeUS();
int64_t waittime = starttime + 40 * 1000 - finishtime;
if (waittime > 0 && waittime <= 40 * 1000) {
std::this_thread::sleep_for(std::chrono::microseconds(waittime));
}
doAction();
}
void test5()
{
uint64_t starttime = systemTimeUS();
printf("[main] now system time: [%lu]us\n", starttime);
doAction_50ms();
uint64_t finishtime = systemTimeUS();
int64_t waittime = starttime + 40 * 1000 - finishtime;
if (waittime > 0 && waittime <= 40 * 1000) {
std::this_thread::sleep_for(std::chrono::microseconds(waittime));
}
doAction();
}