我在做一个视频流的底层通信,现在就是要通过tcp线程来接受数据流,并放入一个循环队列中,然后再通过udp线程发送出去。遇到的问题是,该怎么把接收到的数据流放入队列里去呢?我的想法是把接受缓冲区的指针放入队列里
下面是我的队列的实现代码:
//BufQueue.h
#include "stdafx.h"
#include <windows.h>
#define MAX_SIZE 1024
#pragma once
class BufQueue
{
public:
BufQueue(void);
~BufQueue(void);
void push(char *p);
char * pop();
public:
char **base;
int front;
int rear;
CRITICAL_SECTION m_cs;//读写互斥锁
};
//BufQueue.cpp
#include "StdAfx.h"
#include <string.h>
#include "BufQueue.h"
BufQueue::BufQueue(void)
{
base = new char *[MAX_SIZE];
front = rear = 0;
InitializeCriticalSection(&m_cs);
}
BufQueue::~BufQueue(void)
{
delete []base;
base = NULL;
DeleteCriticalSection(&m_cs);
}
void BufQueue::push(char *p)
{
EnterCriticalSection(&m_cs);
if((rear+1)%MAX_SIZE == front)
printf("warning:队列满");
base[rear] = p;
rear = (rear+1)%MAX_SIZE;
LeaveCriticalSection(&m_cs);
}
char *BufQueue::pop()
{
char *ret = NULL;
EnterCriticalSection(&m_cs);
if(front != rear)
{
ret = base[front];
front = (front+1)%MAX_SIZE;
}
LeaveCriticalSection(&m_cs);
return ret;
}
//main.cpp
#include "stdafx.h"
#include "BufQueue.h"
#include <Windows.h>
DWORD WINAPI Run1proc(LPVOID lpParameter);
DWORD WINAPI Run2proc(LPVOID lpParameter);
BufQueue bufQueue;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE thread1;
HANDLE thread2;
thread1=CreateThread(NULL,0,Run1proc,NULL,0,NULL);
thread2=CreateThread(NULL,0,Run2proc,NULL,0,NULL);
CloseHandle(thread1);
CloseHandle(thread2);
Sleep(1000);
return 0;
}
DWORD WINAPI Run1proc(LPVOID lpParameter)
{
char *p = "Hello,welcome";
for(int i=0;i<10;i++)
{
bufQueue.push(p);
}
return 0;
}
DWORD WINAPI Run2proc(LPVOID lpParameter)
{
char *ret = NULL;
int i = 1;
ret = bufQueue.pop();
while(ret!=NULL)
{
printf("%d,%s\n",i,ret);
i++;
ret = bufQueue.pop();
}
return 0;
}
测试函数是把字符串指针放入队列,可以执行,但是如果是一个指向接受缓冲区的指针,好像指针是放进去了,但就是数据没放进去,例如
char *recvbuf = new char[1024];//接受缓冲区
.........
recv(socket,recvbuf,1024,0);//tcp接受
........
像这样,该如何把收到的数据recvbuf放入队列让udp线程取呢
又例如一个结构体
typedef struct
{
unsigned char name[5];
unsigned char sex;
unsigned int age
}Person;
对于上面的结构体,又该怎么存入队列呢,
这个问题困惑我好几天了,请路过的高手们指点指点,我是用vs2003编译的
------解决方案--------------------------------------------------------
第一:你是要放字符串,你放字符串指针干吗,你又不维护指针?
第二:写多线程时也要考虑效率,要维持最小范围、最短时间锁。
------解决方案--------------------------------------------------------
就是这一句,改成strcpy或memcpy都行,选一个合适的用就行了。
base[rear] = p
------解决方案--------------------------------------------------------
本来我确实想存放指针的 该怎么弄