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:
댓글 달기