【问题标题】:How to use chrono sleep until without lag?如何使用计时睡眠直到没有滞后?
【发布时间】:2020-06-30 06:01:34
【问题描述】:

我只是 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_until 仅当您在循环之前定义结束时间并在循环内增加它时才能准确工作 - 否则时间会漂移。这是你需要的吗? stackoverflow.com/questions/39987806/accurate-sampling-in-c/…
  • @Galik 我这样做了,没有滞后了,但是 id 为 45 的第二个标记不等待定义的时间,并出现,消失反复闪烁。

标签: c++ delay sleep chrono aruco


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多