20 个解决方案
#1
study
#2
share first queue point
#3
能给我一份程序吗,可以帮你看看。
#4
yonggl@sina.com
#5
我帮你调试好吗,hujun@serve100ok.com
#6
new/delete肯定可以,只要在一个进程内。但入队/出对必须互斥,否则将引起不可预见的问题
做法,申明一个原子操作对象如CMutex mutex,在每个线程要调用队列的成员时首先mutex.lock(),然后再Unlock(),就不会有问题了
做法,申明一个原子操作对象如CMutex mutex,在每个线程要调用队列的成员时首先mutex.lock(),然后再Unlock(),就不会有问题了
#7
ujun614(胡均):我看不一定,你会调试。我用DirextX的DirectShow来播放媒体流,用DirectPlay来网络传输
#8
ourworld() :我用的临界区实现的互斥.在一个进程内好象用临界区就可以了用CMutex mutex好象更占用资源.我更关心的是,内存释放的问题,内存共享好象没有问题.
#9
没有人回答??
#10
跨进程进行内存操作可能是有问题,我连分配都有过报错,但编译却是能通过的。
估计有更好的方法能实现。
估计有更好的方法能实现。
#11
hxd1114(*者) :我的仅仅是跨线程分配,还没有到达跨进程分配的程度。能用另外的分配方法吗?比如,那个COM接口
#12
临界够了,没错delete在同进程内没问题,如果delete非法说明指针有错或不使用new分配,或许你可以说的更详细一点
#13
修改队列指针时注意线程同步
#14
Kevin_qing(Kevin):我这个没有线程同步的问题(不必要)。只需要,互斥使用队列。
#15
你不能这样做,应该是通过共享内存的机制来进行,对于这块内存,使用临界区来进行
控制。
控制。
#16
怨代码呢??
贴除来啊!
贴除来啊!
#17
入队: PATCKET_MPEG1_DATA_NODE *pDataMsgNode;
pDataMsgNode = new PATCKET_MPEG1_DATA_NODE;
EnterCriticalSection( &g_csDataList );
//入队
pDataMsgNode->pPrev = g_DataHead.pPrev;
pDataMsgNode->pNext = &g_DataHead;
g_DataHead.pPrev->pNext = pDataMsgNode;
g_DataHead.pPrev = pDataMsgNode;
//填充数据
pDataMsgNode->mpeg1Data.dwPacketId = pMsg->dwPacketId;
pDataMsgNode->mpeg1Data.dwType = pMsg->dwType;
pDataMsgNode->mpeg1Data.mt.majortype = pMsg->mt.majortype ;
pDataMsgNode->mpeg1Data.mt.subtype = pMsg->mt.subtype;
CopyMemory(pDataMsgNode->mpeg1Data.pBuffer, pMsg->pBuffer, 32768);
strcpy(pDataMsgNode->mpeg1Data.szMediaFileName, pMsg->szMediaFileName);
LeaveCriticalSection( &g_csDataList );
出队:
PATCKET_MPEG1_DATA_NODE* pSendNode;
PATCKET_MPEG1_DATA_NODE* pNode = g_DataHead.pNext;
while( true)
{
EnterCriticalSection( &g_csDataList );
if (pNode != &g_DataHead )
{
pSendNode = pNode;
//从双循环链表中删去节点
pSendNode->pNext->pPrev = &g_DataHead;
g_DataHead.pNext = pSendNode->pNext;
//得到值
PBYTE pBuffer = new BYTE[32768];
CopyMemory(pBuffer,pSendNode->mpeg1Data.pBuffer, 32768);
//delete pSendNode;
//pSendNode=0;
//转发数据到流的缓冲
while ((g_pMediaDataStream->AddBuf(pBuffer) ==-1))
{
SetEvent( g_hDPBroadCastAvailEvent);
Sleep(10);
};
//delete[] pBuffer;
//pBuffer = 0;
//得到下一个待处理节点
pNode = g_DataHead.pNext;
}
else
{
pNode = g_DataHead.pNext;
Sleep(10);
}
LeaveCriticalSection( &g_csDataList );
}
pDataMsgNode = new PATCKET_MPEG1_DATA_NODE;
EnterCriticalSection( &g_csDataList );
//入队
pDataMsgNode->pPrev = g_DataHead.pPrev;
pDataMsgNode->pNext = &g_DataHead;
g_DataHead.pPrev->pNext = pDataMsgNode;
g_DataHead.pPrev = pDataMsgNode;
//填充数据
pDataMsgNode->mpeg1Data.dwPacketId = pMsg->dwPacketId;
pDataMsgNode->mpeg1Data.dwType = pMsg->dwType;
pDataMsgNode->mpeg1Data.mt.majortype = pMsg->mt.majortype ;
pDataMsgNode->mpeg1Data.mt.subtype = pMsg->mt.subtype;
CopyMemory(pDataMsgNode->mpeg1Data.pBuffer, pMsg->pBuffer, 32768);
strcpy(pDataMsgNode->mpeg1Data.szMediaFileName, pMsg->szMediaFileName);
LeaveCriticalSection( &g_csDataList );
出队:
PATCKET_MPEG1_DATA_NODE* pSendNode;
PATCKET_MPEG1_DATA_NODE* pNode = g_DataHead.pNext;
while( true)
{
EnterCriticalSection( &g_csDataList );
if (pNode != &g_DataHead )
{
pSendNode = pNode;
//从双循环链表中删去节点
pSendNode->pNext->pPrev = &g_DataHead;
g_DataHead.pNext = pSendNode->pNext;
//得到值
PBYTE pBuffer = new BYTE[32768];
CopyMemory(pBuffer,pSendNode->mpeg1Data.pBuffer, 32768);
//delete pSendNode;
//pSendNode=0;
//转发数据到流的缓冲
while ((g_pMediaDataStream->AddBuf(pBuffer) ==-1))
{
SetEvent( g_hDPBroadCastAvailEvent);
Sleep(10);
};
//delete[] pBuffer;
//pBuffer = 0;
//得到下一个待处理节点
pNode = g_DataHead.pNext;
}
else
{
pNode = g_DataHead.pNext;
Sleep(10);
}
LeaveCriticalSection( &g_csDataList );
}
#18
http://www.csdn.net/expert/topic/464/464120.shtm
帮帮我吧(网吧管理软件)
帮帮我吧(网吧管理软件)
#19
zzh():我这个也是共享内存--临界区管理。不过用双向循环链表实现动态队列。因为得到数据---从网络,我不能保证同步。用数据载媒体流的中,我也不能保证。所以,用链表实现队列。有柔性,对于环境苛刻的场合使用。
#20
没有人??来喝彩!!!!这个问题,解决了。能够分配,不过频繁的分配释放,要死掉。我的仔细处理。
#21
#1
study
#2
share first queue point
#3
能给我一份程序吗,可以帮你看看。
#4
yonggl@sina.com
#5
我帮你调试好吗,hujun@serve100ok.com
#6
new/delete肯定可以,只要在一个进程内。但入队/出对必须互斥,否则将引起不可预见的问题
做法,申明一个原子操作对象如CMutex mutex,在每个线程要调用队列的成员时首先mutex.lock(),然后再Unlock(),就不会有问题了
做法,申明一个原子操作对象如CMutex mutex,在每个线程要调用队列的成员时首先mutex.lock(),然后再Unlock(),就不会有问题了
#7
ujun614(胡均):我看不一定,你会调试。我用DirextX的DirectShow来播放媒体流,用DirectPlay来网络传输
#8
ourworld() :我用的临界区实现的互斥.在一个进程内好象用临界区就可以了用CMutex mutex好象更占用资源.我更关心的是,内存释放的问题,内存共享好象没有问题.
#9
没有人回答??
#10
跨进程进行内存操作可能是有问题,我连分配都有过报错,但编译却是能通过的。
估计有更好的方法能实现。
估计有更好的方法能实现。
#11
hxd1114(*者) :我的仅仅是跨线程分配,还没有到达跨进程分配的程度。能用另外的分配方法吗?比如,那个COM接口
#12
临界够了,没错delete在同进程内没问题,如果delete非法说明指针有错或不使用new分配,或许你可以说的更详细一点
#13
修改队列指针时注意线程同步
#14
Kevin_qing(Kevin):我这个没有线程同步的问题(不必要)。只需要,互斥使用队列。
#15
你不能这样做,应该是通过共享内存的机制来进行,对于这块内存,使用临界区来进行
控制。
控制。
#16
怨代码呢??
贴除来啊!
贴除来啊!
#17
入队: PATCKET_MPEG1_DATA_NODE *pDataMsgNode;
pDataMsgNode = new PATCKET_MPEG1_DATA_NODE;
EnterCriticalSection( &g_csDataList );
//入队
pDataMsgNode->pPrev = g_DataHead.pPrev;
pDataMsgNode->pNext = &g_DataHead;
g_DataHead.pPrev->pNext = pDataMsgNode;
g_DataHead.pPrev = pDataMsgNode;
//填充数据
pDataMsgNode->mpeg1Data.dwPacketId = pMsg->dwPacketId;
pDataMsgNode->mpeg1Data.dwType = pMsg->dwType;
pDataMsgNode->mpeg1Data.mt.majortype = pMsg->mt.majortype ;
pDataMsgNode->mpeg1Data.mt.subtype = pMsg->mt.subtype;
CopyMemory(pDataMsgNode->mpeg1Data.pBuffer, pMsg->pBuffer, 32768);
strcpy(pDataMsgNode->mpeg1Data.szMediaFileName, pMsg->szMediaFileName);
LeaveCriticalSection( &g_csDataList );
出队:
PATCKET_MPEG1_DATA_NODE* pSendNode;
PATCKET_MPEG1_DATA_NODE* pNode = g_DataHead.pNext;
while( true)
{
EnterCriticalSection( &g_csDataList );
if (pNode != &g_DataHead )
{
pSendNode = pNode;
//从双循环链表中删去节点
pSendNode->pNext->pPrev = &g_DataHead;
g_DataHead.pNext = pSendNode->pNext;
//得到值
PBYTE pBuffer = new BYTE[32768];
CopyMemory(pBuffer,pSendNode->mpeg1Data.pBuffer, 32768);
//delete pSendNode;
//pSendNode=0;
//转发数据到流的缓冲
while ((g_pMediaDataStream->AddBuf(pBuffer) ==-1))
{
SetEvent( g_hDPBroadCastAvailEvent);
Sleep(10);
};
//delete[] pBuffer;
//pBuffer = 0;
//得到下一个待处理节点
pNode = g_DataHead.pNext;
}
else
{
pNode = g_DataHead.pNext;
Sleep(10);
}
LeaveCriticalSection( &g_csDataList );
}
pDataMsgNode = new PATCKET_MPEG1_DATA_NODE;
EnterCriticalSection( &g_csDataList );
//入队
pDataMsgNode->pPrev = g_DataHead.pPrev;
pDataMsgNode->pNext = &g_DataHead;
g_DataHead.pPrev->pNext = pDataMsgNode;
g_DataHead.pPrev = pDataMsgNode;
//填充数据
pDataMsgNode->mpeg1Data.dwPacketId = pMsg->dwPacketId;
pDataMsgNode->mpeg1Data.dwType = pMsg->dwType;
pDataMsgNode->mpeg1Data.mt.majortype = pMsg->mt.majortype ;
pDataMsgNode->mpeg1Data.mt.subtype = pMsg->mt.subtype;
CopyMemory(pDataMsgNode->mpeg1Data.pBuffer, pMsg->pBuffer, 32768);
strcpy(pDataMsgNode->mpeg1Data.szMediaFileName, pMsg->szMediaFileName);
LeaveCriticalSection( &g_csDataList );
出队:
PATCKET_MPEG1_DATA_NODE* pSendNode;
PATCKET_MPEG1_DATA_NODE* pNode = g_DataHead.pNext;
while( true)
{
EnterCriticalSection( &g_csDataList );
if (pNode != &g_DataHead )
{
pSendNode = pNode;
//从双循环链表中删去节点
pSendNode->pNext->pPrev = &g_DataHead;
g_DataHead.pNext = pSendNode->pNext;
//得到值
PBYTE pBuffer = new BYTE[32768];
CopyMemory(pBuffer,pSendNode->mpeg1Data.pBuffer, 32768);
//delete pSendNode;
//pSendNode=0;
//转发数据到流的缓冲
while ((g_pMediaDataStream->AddBuf(pBuffer) ==-1))
{
SetEvent( g_hDPBroadCastAvailEvent);
Sleep(10);
};
//delete[] pBuffer;
//pBuffer = 0;
//得到下一个待处理节点
pNode = g_DataHead.pNext;
}
else
{
pNode = g_DataHead.pNext;
Sleep(10);
}
LeaveCriticalSection( &g_csDataList );
}
#18
http://www.csdn.net/expert/topic/464/464120.shtm
帮帮我吧(网吧管理软件)
帮帮我吧(网吧管理软件)
#19
zzh():我这个也是共享内存--临界区管理。不过用双向循环链表实现动态队列。因为得到数据---从网络,我不能保证同步。用数据载媒体流的中,我也不能保证。所以,用链表实现队列。有柔性,对于环境苛刻的场合使用。
#20
没有人??来喝彩!!!!这个问题,解决了。能够分配,不过频繁的分配释放,要死掉。我的仔细处理。