OpenCV多线程XInitThreads错误

时间:2014-07-15 15:42:54

标签: c multithreading opencv

我是一名嵌入式程序员,使用多线程应用程序,它将通过串行线接收像素数据并将其显示在窗口中。我正在使用openCV的cvSetData()方法来复制通过串行线接收的数据并将其填充到openCV数组中。同样使用cvShowImage()函数我正在显示不断更新的像素数据(显示视频的概念)。

以下是我的代码中的代码段:

    //-------------------------------------Start of code------------------------------------//
#include <stdio.h>
#include <stdlib.h>

#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <sys/select.h>
#include "serial_comm_defines.h"

#include <opencv2/highgui/highgui.hpp>

#include <signal.h>
#include <time.h>
#include <sys/time.h>

#include <pthread.h>



extern unsigned char array[COUNT_LIM];
IplImage *newimage;

img_disp_method(void)
{

cvSetData((CvArr*)newimage, (void*)array, 1556);
cvNamedWindow("Mywindow",CV_WINDOW_FREERATIO);
cvResizeWindow("Mywindow", 1556, 360);
cvShowImage("Mywindow",(CvArr*)newimage);
cvWaitKey(1);

}


void *serial_thread_method(void* my_fd)
{
clock_t start = 0, end = 0;
double time_taken = 0;

if ((int)my_fd<0)
printf("\nError opening device file\n");
else
{
printf("\nDevice file opened successfully\n");
if ( serial_config((int)my_fd) < 0)
printf("\nUnable to configure serial port\n");
else
{
printf("\nSerial port configured successfully\n");

for(;;)
{
    start = clock();

serial_read((int)my_fd);

    end = clock();

    printf("\nTime taken:%f seconds\n", (double)((end-start)/CLOCKS_PER_SEC));
}

}
}

close ((int)my_fd);

return NULL;
}


int main(int argc, char **argv)
{
pthread_t  serial_read_thread;
int my_fd=0, i=0, temp=0, serial_thread_ret=0;
newimage = cvCreateImageHeader(cvSize(HEIGHT, WIDTH), IPL_DEPTH_8U, 0x01);
struct timeval my_value={0,10000};
struct timeval my_interval={0,10000};
struct itimerval my_timer={my_interval,my_value};

setitimer(ITIMER_REAL, &my_timer, 0);
signal(SIGALRM,  img_disp_method);

my_fd = open_device_file((char**)argv);


if ( (serial_thread_ret = pthread_create(&serial_read_thread, NULL, serial_thread_method, (void*)my_fd) == 0))
    fprintf(stdout, "\nSerial read thread created successfully\n");
else
    perror("\nError creating serial read thread\n");


pthread_join(&serial_read_thread, NULL);

cvReleaseImageHeader(&newimage);

return NULL;
}
//----------------------------------------End of code--------------------------------------//

代码编译正常。但是当我执行二进制文件时,它会抛出以下错误。我还观察到,如果将timer的值(my_value和my_interval的值)更改为大于30ms(30000)的任何值,则代码可以正常工作。请解释一下发生了什么。

1 个答案:

答案 0 :(得分:0)

尝试使用虚拟计时器而不是真正的计时器。

像这样的东西

setitimer(SIGVTALRM, &my_timer, 0);

signal(SIGVTALRM,  img_disp_method);