是否可以创建一个在循环中跳过函数的计时器?
Is it possible to create a timer that skips a function within a loop?
在我的项目中,我使用 opencv 从网络摄像头捕捉帧并通过一些函数检测其中的一些东西。问题是在一个确定的函数中不需要捕获所有的帧,例如每 0.5 秒捕获一个帧就足够了,如果时间还没有结束,循环将继续到下一个函数。代码中的想法是:
while(true){
//read(frame)
//cvtColor(....)
// and other things
time = 0;// start time
if (time == 0.5){
determinatefunction(frame, ...)
}else {
continue;
}
//some others functions
}
我尝试用 chrono 库做类似上面的事情:
// steady_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
using namespace std;
void foo(){
cout << "printing out 1000 stars...\n";
for (int i=0; i<1000; ++i) cout << "*";
cout << endl;
}
int main ()
{
using namespace std::chrono;
steady_clock::time_point t1 = steady_clock::now();
int i = 0;
while(i <= 100){
cout << "Principio del bucle" << endl;
steady_clock::time_point t2 = steady_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
cout << time_span.count() << endl;
if (time_span.count() == 0.1){
foo();
steady_clock::time_point t1 = steady_clock::now();
}else {
continue;
}
cout << "fin del bucle" << endl;
i++;
}
}
但是循环永远不会结束,也不会启动 foo() 函数。
我不能使用posix线程(我看到函数sleep_for)因为我正在使用g++(x86_64-win32-sjlj-rev4,由MinGW-W64项目构建)4.9.2及其与 opencv 2.4.9 一起使用。我尝试用 opencv 实现 mingw posix,但是当包含和库被正确写入时,它会给我一些没有意义的错误,比如 'VideoCapture' was not declared in this scope VideoCapture cap(0)
。
我正在使用 windows 7.
大多数时候将==
与浮点计算结合使用是错误的。
不保证duration_cast<duration<double>>(t2 - t1)
会在差值恰好为0.1
时执行。
相反,它可能类似于 0.099324
,并且在下一次迭代中 0.1000121
改用 >=
并在 if
中定义另一个 t1
没有多大意义。
if (time_span.count() >= 0.1) {
foo();
t1 = steady_clock::now();
}
在我的项目中,我使用 opencv 从网络摄像头捕捉帧并通过一些函数检测其中的一些东西。问题是在一个确定的函数中不需要捕获所有的帧,例如每 0.5 秒捕获一个帧就足够了,如果时间还没有结束,循环将继续到下一个函数。代码中的想法是:
while(true){
//read(frame)
//cvtColor(....)
// and other things
time = 0;// start time
if (time == 0.5){
determinatefunction(frame, ...)
}else {
continue;
}
//some others functions
}
我尝试用 chrono 库做类似上面的事情:
// steady_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
using namespace std;
void foo(){
cout << "printing out 1000 stars...\n";
for (int i=0; i<1000; ++i) cout << "*";
cout << endl;
}
int main ()
{
using namespace std::chrono;
steady_clock::time_point t1 = steady_clock::now();
int i = 0;
while(i <= 100){
cout << "Principio del bucle" << endl;
steady_clock::time_point t2 = steady_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
cout << time_span.count() << endl;
if (time_span.count() == 0.1){
foo();
steady_clock::time_point t1 = steady_clock::now();
}else {
continue;
}
cout << "fin del bucle" << endl;
i++;
}
}
但是循环永远不会结束,也不会启动 foo() 函数。
我不能使用posix线程(我看到函数sleep_for)因为我正在使用g++(x86_64-win32-sjlj-rev4,由MinGW-W64项目构建)4.9.2及其与 opencv 2.4.9 一起使用。我尝试用 opencv 实现 mingw posix,但是当包含和库被正确写入时,它会给我一些没有意义的错误,比如 'VideoCapture' was not declared in this scope VideoCapture cap(0)
。
我正在使用 windows 7.
大多数时候将==
与浮点计算结合使用是错误的。
不保证duration_cast<duration<double>>(t2 - t1)
会在差值恰好为0.1
时执行。
相反,它可能类似于 0.099324
,并且在下一次迭代中 0.1000121
改用 >=
并在 if
中定义另一个 t1
没有多大意义。
if (time_span.count() >= 0.1) {
foo();
t1 = steady_clock::now();
}