用C ++反复跟踪计时器

时间:2017-07-05 13:12:24

标签: c++ timer synchronization c++14 ctime

我有一个库,它接受一个字符串向量作为参数&将它推到矢量字符串(2D矢量)的矢量。 我有一个条件“从第一行被推到2D向量时计时器应该开始&对于每个”X“毫秒我想在字符串向量的末尾添加一些特殊字符串”FLAG_BORDER“我收到的是图书馆的论据。

图书馆代码

using namespace std;
vector<vector<sring>> vecOfVecStrs;
MyLibraryFunction(vector<string> vecstr)
{
    if(TimerLimitNOTHit()) // THIS FUNCTION TimerLimitNOTHit() checks if the "X" 
                           //    th milisecond is reached or not.
    {
          vecOfVecStrs.push_back(vecstr); // If "X"th ms time poeriod is NOT 
                                           // yet reached
    }
    else
    {
         vecstr.push_back("FLAG_BORDER");
         vecOfVecStrs.push_back(vecstr);
    }

申请代码调用图书馆功能::

int main()
{
    do_something();
    vector<string> vecStr;
    while(vecStr = Get_VecTor_of_strings())
    {
        MyLibraryFunction(vecStr);
    }
  

如何在这里实现TimerLimitNOTHit()函数   在函数调用中跟踪计时器“X”milisec   C ++中的“MyLibraryFunction()”?

编辑:看起来就像找到了答案。它会工作吗?

int timeX = 30; //s
bool keepTrack = false;
int ci = 0;
std::vector<int> timeArray;
std::mutex m;

bool keepTracking()
{
    std::unique_lock<std::mutex> lock(m);
    return keepTrack;
}

void GlobalTimer()
{
    while (keepTracking())
    {
        std::this_thread::sleep_for(std::chrono::seconds(timeX));
        timeArray[ci] = 1;
    }
}



 std::thread t1(GlobalTimer);

1 个答案:

答案 0 :(得分:1)

这是一些灵感,如果函数TimerLimitNOTHit自上次返回true以来已超过X ms,则返回true。

int X = ... // #0

bool TimerLimitNOTHit()
{
    static auto start = std::chrono::steady_clock::now(); // #1
    auto now = std::chrono::steady_clock::now(); 
    if (now - start > std::chrono::milliseconds(X))
    {
        start = now // #2
        return true;
    }
    return false
}

#0定义两次调用TimerLimitNOTHit之间返回true的时间距离。

#1初始化取决于您的应用程序逻辑。在此示例中,函数在第一次调用时不返回true,这可以通过将start初始化为零来更改。

#2下一次迭代的起始值,同样取决于您的应用程序逻辑。如果你想要更稳定的真实,你可以做一些模运算。

如果这不是你想要的,请告诉我。

免责声明

我真的不喜欢使用static变量,但如果没有“status”参数,我看不出它是如何避免的。 此外,全局X变量的使用并不属于我的比喻。变量X可以更改为模板变量,这样可以更好地显示intent并使其成为编译时常量。