linux에서 thread사용..
글쓴이: aaa123 / 작성시간: 금, 2014/09/26 - 7:01오후
window에서 짠 소스인데 리눅스로 돌리기 위해서 바꾸는 중입니다.
근데 제가 진짜 초보라서요..... 아무리 봐도 thread를 pthread로바꿔서 사용하는 법을 모르겠습니다..
Thread부분 다 오류나구요 struct SOCKADDR_In serv ,
memset, EncodeFrame *encodeFrame= new EncodeFrame; 이 부분들에서 오류가 납니다.
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"
typedef unsigned long DWORD;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
typedef struct _MyFrame
{
unsigned short width;
unsigned short height;
unsigned char nChannels;
unsigned int imageSize;
unsigned char imageData[921600];
} MyFrame;
typedef struct _EncodeFrame
{
int type;
int rows;
int cols;
char imageData[921600];
} EncodeFrame;
int argWidth = 640, argHeight = 480, argFrame = 15, argRate = 100;
int t;
int timer;
DWORD WINAPI Thread_Timer(LPVOID param)
{
timer = 0;
while (1)
{
timer += 50;
Sleep(50);
}
return 0;
}
#define MODE 0 // Á¼® ½ÿ¡´ÂÁb À·Â Á¼® ¾Èϸéð
DWORD WINAPI Thread_Func(LPVOID param)
{
char mode;
int arg[4];
while (1)
{
#ifdef MODE
recv(t, &mode, 1, 0);
switch (mode)
{
case 1:
argWidth = 640;
argHeight = 480;
argFrame = 30;
argRate = 50;
break;
case 2:
argWidth = 320;
argHeight = 240;
argFrame = 20;
argRate = 50;
break;
case 3:
argWidth = 160;
argHeight = 120;
argFrame = 20;
argRate = 50;
break;
case 4:
argWidth = 160;
argHeight = 120;
argFrame = 10;
argRate = 10;
break;
default:
argWidth = 640;
argHeight = 480;
argFrame = 20;
argRate = 50;
break;
}
#else
recv(t, (char *)arg, 16, 0);
argWidth = arg[0];
argHeight = arg[1];
argFrame = arg[2];
argRate = arg[3];
#endif
Sleep(100);
}
return 0;
}
int main (int argc, char **argv)
{
int feedback[2] = {0};
char *pFrame = 0;
MyFrame myFrame;
EncodeFrame *encodeFrame = new EncodeFrame;
//WSADATA wsa;
int s;
struct SOCKADDR_IN serv;
CvCapture *capture = 0;
IplImage *frame = 0;
double w = 640, h = 480; // 640*480(VGA),
int c;
int i;
/*if(WSAStartup(MAKEWORD(2, 2,), &wsa) != 0)
{
printf("Too high Winsock version.\n");
return -1;
}*/
s = socket(AF_INET, SOCK_STREAM, 0);
if(s == -1)
{
printf("Error in socket()");
close(s);
return -1;
}
memset(&serv, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_port = htons(50000);
serv.sin_addr.s_addr = inet_addr("127.0.0.1");
if(bind(s,(struct SOCKADDR *)&serv, sizeof(serv)) == -1)
{
printf("Error in bind()");
close(s);
WSACleanup();
return -1;
}
listen(s, 5);
t = accept(s, NULL, NULL);
HANDLE thread = CreateThread(NULL, 0, &Thread_Timer, 0, 0, 0);
HANDLE thread2 = CreateThread(NULL, 0, &Thread_Func, 0, 0, 0);
feedback[0] = 0xAAAAAAAA;
feedback[1] = 0;
while(1)
{
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, argWidth);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, argHeight);
int params[3] = {0};
params[0]=CV_IMWRITE_JPEG_QUALITY;
params[1]=argRate;
frame = cvQueryFrame (capture);
CvMat *EncodeImage = cvEncodeImage(".jpg", frame, params);
encodeFrame->rows = EncodeImage->rows;
encodeFrame->cols = EncodeImage->cols;
encodeFrame->type = EncodeImage->type;
for (i; i < encodeFrame->cols; i++)
{
encodeFrame->imageData[i] = EncodeImage->data.ptr[i];
}
pFrame = (char *)encodeFrame;
send(t, pFrame, 12 + EncodeImage->cols, 0);
feedback[1] += 12 + EncodeImage->cols;
if ( timer >= 1000)
{
char *pTemp = (char *)feedback;
send(t, pTemp, 8, 0);
timer = 0;
feedback[1] = 0;
}
Sleep((int)(1000. / argFrame));
cvReleaseMat(&EncodeImage);
}
cvReleaseCapture (&capture);
close(s);
WSACleanup();
return 0;
}Forums:


댓글 달기