来源:http://blog.youkuaiyun.com/lezhiyong
视频软件中常见多路视频发送/接收的应用场景,如多用户视频会议、多路视频监控、多人视频群聊等。
一般一路视频涉及到发送端视频采集、显示、编码、网络发送,接收端涉及接收端网络数据接收、解码、显示等数据链路,链路里面也常使用到线程来推/拉数据,那么对于多路视频会有多个线程并发运行,这类视频软件开发中经常遇到需要在代码中定位某函数被哪个线程调用,如一下场景:
调试时候可以使用下面工具类来确定某时刻的数据处理函数processFun和网络发送公共函数被那个线程调用:
头文件:#define MAX_THREADID_NUM 100
class CViThreadID
{
public:
static bool SetThreadID(int32 nID);
static bool IsThreadID(int32 nID);
private:
static uint32 m_dwThreadID[MAX_THREADID_NUM];
};
Cpp 文件:
#include <Windows.h>
uint32 CViThreadID::m_dwThreadID[MAX_THREADID_NUM];
bool CViThreadID::SetThreadID(int32 nID)
{
_ASSERT((nSub >= 0) && (nSub < MAX_THREADID_NUM));
m_dwThreadID[nSub] = ::GetCurrentThreadId();
return true;
}
bool CViThreadID::IsThreadID(int32 nID)
{
_ASSERT((nSub >= 0) && (nSub < MAX_THREADID_NUM));
_ASSERT(m_dwThreadID[nSub] != 0);
return m_dwThreadID[nSub] == ::GetCurrentThreadId();
}
使用方法:
第1路视频线程Thread1创建函数()
{
CViThreadID::SetThreadID(1);
_ASSERT(CViThreadID::IsThreadID(1));
…
}
第2路视频线程Thread2创建函数()
{
CViThreadID::SetThreadID(2);
_ASSERT(CViThreadID::IsThreadID(2));
…
}
…..
视频链路类::数据处理函数processFun()
{
if(CViThreadID::IsThreadID(1))
{
//第1路视频线程的数据调试处理
….
}
….
}
视频数据网络发送公共调用函数()
{
if(CViThreadID::IsThreadID(1))
{
//第1路视频线程的数据调试处理
….
}
if(CViThreadID::IsThreadID(2))
{
//第2路视频线程的数据调试处理
….
}
}