void WaveInProc(...............)
{
lpRecord->m_lsRecordData.AddTail(data);
g_bListCount++;
}SendVoiceThreadProc(LPVOID lpParam)
{if ( g_nListCount >=2) //在这里设了标志还是不行。
{
pSendVoice->m_pRecordData->RemoveHead(); // generates INT 3
g_nListCount--;
}
}
{
lpRecord->m_lsRecordData.AddTail(data);
g_bListCount++;
}SendVoiceThreadProc(LPVOID lpParam)
{if ( g_nListCount >=2) //在这里设了标志还是不行。
{
pSendVoice->m_pRecordData->RemoveHead(); // generates INT 3
g_nListCount--;
}
}
然后在他的添加或者是删除时使用事件等临界区访问控制
使两个线程互斥访问链表就可以了
两个线程一起操作这个的时候,没有互斥访问的话,会容易出现问题的。
// 文件上传的任务列表操作类
class CUploadFileDeque
{
private:
// 查找这个元素是否存在的仿函数
class UPLOAD_FILE_STRUCT_Find
{
public:
UPLOAD_FILE_STRUCT_Find(string strRecvAddr, int nRecvPort, string strChannel, string strResolution)
{
m_strRecvAddr = strRecvAddr;
m_nRecvPort = nRecvPort;
m_strChannel = strChannel;
} bool operator()(const UPLOAD_FILE_STRUCT& srcPara)
{
if ( (m_strRecvAddr == srcPara.strRecvAddr)
&& (m_nRecvPort == srcPara.nRecvPort)
&& (m_strChannel == srcPara.strChannel)
&& (m_strResolution == srcPara.strResolution) )
{
return true;
}
else
{
return false;
}
} private:
string m_strRecvAddr;
int m_nRecvPort;
string m_strChannel;
string m_strResolution;
};public:
CUploadFileDeque(void)
{
InitializeCriticalSection(&m_cs);
} ~CUploadFileDeque(void)
{
DeleteCriticalSection(&m_cs);
} UPLOAD_FILE_DEQUE* Lock()
{
EnterCriticalSection(&m_cs);
if (m_UploadFileDeque.size())
{
return &m_UploadFileDeque;
} return NULL;
} bool UnLock()
{
LeaveCriticalSection(&m_cs);
return true;
} // 查找列表中是否有2个该通道到某地址的任务,有则删除最后一个并添加新的上传任务
bool PushBack(const UPLOAD_FILE_STRUCT& para)
{
Lock();
int nFindCount = static_cast<int>( count_if(m_UploadFileDeque.begin(), m_UploadFileDeque.end(),
UPLOAD_FILE_STRUCT_Find(para.strRecvAddr,
para.nRecvPort,
para.strChannel,
para.strResolution)) );
if (2 == nFindCount) // 已有2个任务则取消
{
UnLock();
return false;
} m_UploadFileDeque.push_back(para);
UnLock(); return true;
} // 取出一个任务交给上传线程
UPLOAD_FILE_STRUCT PopFront()
{
Lock();
UPLOAD_FILE_STRUCT UploadFile;
if (m_UploadFileDeque.size())
{
UploadFile = *(m_UploadFileDeque.begin());
m_UploadFileDeque.pop_front();
}
UnLock();
return UploadFile;
} // 判断列表是否为空
bool IsEmpty()
{
return m_UploadFileDeque.empty();
} // 清空列表
bool clear()
{
m_UploadFileDeque.clear();
return true;
} // 调试时函数:返回列表大小
int GetSize()
{
return (int)(m_UploadFileDeque.size());
}private:
UPLOAD_FILE_DEQUE m_UploadFileDeque;
CRITICAL_SECTION m_cs;};