延迟组合c ++程序的输出

时间:2013-09-15 19:47:56

标签: c++

我有两个用c ++编写的程序。一种是与arduino( pgm1 )进行通信,另一种是使用openCV程序读取网络摄像头( pgm2 )。他们独立地以道德的速度工作。

如果我们在不同的终端同时打开它们,它们可以完美运行。我想将它们作为单个程序加入,我尝试了一个程序(pgm3)。我可以实时完美地获得图像..但arduino的数据延迟大约7-10秒。不幸的是我只知道c / c ++ / embedded c。所以请用任何一种语言向我推荐一个解决方案

PGM1

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
char ch;
ifstream f;
f.open("/dev/ttyACM0");
while (f.get(ch)) 
{
cout<<ch;   
if(ch=='#')
cout<<endl;
}
return 0;

PGM2

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
/** Function Headers */
String window_name = "webcam c170 preview";
/** @function main */
int main( void )
{
VideoCapture capture;
Mat frame;

capture.open( 1 );
if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }

while ( capture.read(frame) )
{
    if( frame.empty() )
    {
        printf(" --(!) No captured frame -- Break!");
        break;
    }

    //-- 3. show frames
    imshow( window_name, frame );
    int c = waitKey(30);
    if( (char)c == 27 ) { break; } // escape
}
return 0;
}
}

PGM3

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include<fstream>
using namespace std;
using namespace cv;
void spi_read(void);
/** Global variables */
char ch;
ifstream f;
String window_name = "webcam c170 preview";
/** @function main */
int main( void )
{
VideoCapture capture;
Mat frame;
f.open("/dev/ttyACM0");
capture.open( 1 );
if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }

while ( capture.read(frame) )
{
    if( frame.empty() )
    {
        printf(" --(!) No captured frame -- Break!");
        break;
    }   
    //-- 3. show frames
    imshow( window_name, frame );
    int c = waitKey(30);
    if( (char)c == 27 ) { break; } // escape
spi_read();
}
return 0;
}
void spi_read()
{
String str_spi;
do
{
    f.get(ch);
    str_spi=str_spi+ch;
}while(ch!='#');
cout<<str_spi<<endl;

}

1 个答案:

答案 0 :(得分:0)

不要只将代码合并到一个函数中 - 当然它会导致你的第二个程序“延迟” - 因为它在你的优惠代码完成后开始执行。
您应该创建单独的线程来模拟ur pgm1 / pgm2程序,然后根据您的需要处理它们在主线程中接收的数据。
使用boost / thread的最直接的解决方案:

void do_what_pgm1_does() {..}  
void do_what_pgm2_does() {..}
int main()
{
  boost::thread t1(do_what_pgm1_does);  
  boost::thread t2(do_what_pgm2_does);
  t1.join();
  t2.join();
}

这将为您提供与2个进程类似的执行。