我有一个库,它接受一个字符串向量作为参数&将它推到矢量字符串(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);
答案 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并使其成为编译时常量。