c++ - 如何使用计时睡眠直到没有滞后?
问题描述
我只是 C++ 的初学者,我需要在现有的四个标记上绘制对象,每个标记之间有一个延迟,我尝试使用 Chrono_sleep_until,但它导致我的程序滞后,甚至对象立即出现并且在第二个标记上消失,我知道有问题但无法猜测可能是什么,有什么帮助吗?
std::vector<int> ids;
std::vector<std::vector<cv::Point2f> > corners;
cv::aruco::detectMarkers(image, marker_dict, corners, ids);
// Draw markers using opencv tool
cv::aruco::drawDetectedMarkers(mid, corners, ids);
// Draw markers custom
for (size_t i = 0; i < corners.size(); ++i)
{
// Convert to integer ponits
int num = static_cast<int>(corners[i].size());
std::vector<cv::Point> points;
for (size_t j = 0; j < corners[i].size(); ++j)
points.push_back(cv::Point(static_cast<int>(corners[i][j].x), static_cast<int>(corners[i][j].y)));
const cv::Point* pts = &(points[0]);
// Draw
if (ids.at(i) == 32) {
cv::fillPoly(right, &pts, &num, 1, cv::Scalar(255, 0, 0));
}
std::chrono::system_clock::time_point timePoint = std::chrono::system_clock::now() + std::chrono::seconds(2);
std::this_thread::sleep_until(timePoint);
if (ids.at(i) == 45) {
cv::fillPoly(right, &pts, &num, 1, cv::Scalar(255, 0, 0));
break;
}
解决方案
sleep 非常适合 PoC 和小问题的快速修复,但对于大多数严肃的项目,您可能需要考虑使用计时器,等到计时器达到您的延迟后再继续。然后你的其余代码仍在执行,没有线程在休眠。
这是一个过于简化的解决方案,只是为了给你这个概念,它会在调用 DrawA() 后 1 秒调用 DrawB() 而不会休眠
#include <windows.h>
#include <iostream>
#include <chrono>
using Clock = std::chrono::steady_clock;
std::chrono::time_point<std::chrono::steady_clock> start, now;
std::chrono::milliseconds duration;
bool bDoDrawA = true;
bool bDoDrawB = false;
void DrawA()
{
std::cout << "DrawA()" << std::endl;
bDoDrawB = true;
bDoDrawA = false;
}
void DrawB()
{
std::cout << "DrawB()" << std::endl;
bDoDrawB = false;
bDoDrawA = true;
start = Clock::now();
}
int main()
{
while (true)
{
if (bDoDrawA)
{
DrawA();
}
if (bDoDrawB)
{
now = Clock::now();
duration = std::chrono::duration_cast<std::chrono::milliseconds>(now - start);
if (duration.count() >= 2000)
{
DrawB();
}
}
}
return 0;
}
推荐阅读
- angular - Angular 服务方法执行顺序
- javascript - 如何使用 node.js 定义可以从不同文件访问的变量?
- c# - 近点统一运动
- macos - 将数百万张图像从 Macos 移动/复制到外部驱动器到 ubuntu 服务器
- javascript - 我们如何在 Vue-cli 中导入外部脚本
- google-bigquery - 是否可以在 BigQuery 中取消嵌套数组,以便将嵌套数据按键值拆分为列?
- php - 如果数组中出现空值,则向数组添加零
- java - 使用 JSch 将文件内容下载到字符串
- android - Camera 2 API 会降低拍摄后的质量
- java - 是否可以为 API 范围定义特定尺寸?