首页 > 解决方案 > 如何使用计时睡眠直到没有滞后?

问题描述

我只是 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;
            
        
            }

标签: c++delaysleepchronoaruco

解决方案


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;
}


推荐阅读