我现在做语音传输可以支持八路的通话,现有一个线程是采集声音然后发送出去。线程调用了一个回调函数voiceThreadPro这个函数。这个函数是实现语音采集然后发送的。我的问题是如果支持八点的啊,我是不是得创建八个线程,这八个线程可以同时调用voiceThreadPro这个函数吗?我还需要维护这八路的通话,那么就需要知道已经创建的线程ID号。我应该如何实现?谢谢大家
调试欢乐多
另外一种思路是CreatThread本身创建成功后会返回一个线程句柄,那么是否可以使用这个句柄来分别维护你那不同的线程呢。
上面函数的具体使用方法可以查阅MSDN,希望可以对你有所帮助。
#ifndef OwnerPolicy_H
#define OwnerPolicy_H//////////////////////////////////////////////////////////////////////////template <class Owner>
class OwnerPolicy
{
public:
OwnerPolicy()
: owner_(0)
{
} inline Owner * owner() const { return owner_; }
inline void owner(Owner *_owner) { owner_ = _owner; }private:
Owner *owner_;
};//////////////////////////////////////////////////////////////////////////#endif#include <WTypes.h>
#include <Process.h>//////////////////////////////////////////////////////////////////////////#include "OwnerPolicy.h"//////////////////////////////////////////////////////////////////////////template <class Owner>
class CThread : public OwnerPolicy<Owner>
{
typedef CThread<Owner> This; typedef struct tagThreadParam
{
HANDLE hEventEnter;
This *pThread;
} ThreadParam;public:
CThread()
: m_hThread(NULL),
m_hEventExit(NULL)
{
}
virtual ~CThread()
{
Stop();
} HANDLE Start()
{
Owner *pOwner = NULL; HANDLE hEventEnter = NULL; unsigned nThreadID = 0;
ThreadParam threadParam = { 0 }; bool bRet = false; pOwner = this->owner();
hEventEnter = CreateEvent(NULL, TRUE, FALSE, NULL);
if (pOwner == NULL || hEventEnter == NULL || m_hThread != NULL) {
goto Exit;
} threadParam.pThread = this;
threadParam.hEventEnter = hEventEnter; m_hThread = (HANDLE) _beginthreadex(NULL, 0, CThread::ThreadProcess, &threadParam, 0, &nThreadID);
if (m_hThread == NULL) {
goto Exit;
} WaitForSingleObject(hEventEnter, INFINITE); Exit:
if (hEventEnter != NULL) {
CloseHandle(hEventEnter);
hEventEnter = NULL;
}
return m_hThread;
} void Stop()
{
if (m_hEventExit != NULL) {
SetEvent(m_hEventExit);
m_hEventExit = NULL;
} WaitForSingleObject(m_hThread, INFINITE);
m_hThread = NULL;
}private:
static unsigned __stdcall ThreadProcess(LPVOID pParam)
{
ThreadParam *pThreadParam = static_cast<ThreadParam *>(pParam);
return pThreadParam->pThread->SvcBase(pThreadParam->hEventEnter);
} unsigned SvcBase(HANDLE hEventEnter)
{
Owner *pOwner = NULL;
unsigned nRet = 0; HANDLE hEventExit = CreateEvent(NULL, TRUE, FALSE, NULL); pOwner = owner();
if (pOwner == NULL || hEventExit == NULL) {
goto Exit;
}
ResetEvent(hEventExit);
m_hEventExit = hEventExit; SetEvent(hEventEnter);
nRet = pOwner->Svc(this, hEventExit); Exit:
if (hEventExit != NULL) {
CloseHandle(hEventExit);
hEventExit = NULL;
} m_hThread = NULL;
return nRet;
}private:
HANDLE m_hThread;
HANDLE m_hEventExit;
};//////////////////////////////////////////////////////////////////////////#endif
unsigned PCServerManager::Svc(CThread<PCServerManager> *pThread, HANDLE hEventExit)
{
if (&m_threadSchedule == pThread) {
SchedulePump(hEventExit);
}
else if (&m_threadStart == pThread) {
Sleep(1000);
StartNetwork();
}
else if (&m_threadLog == pThread) {
LogService(hEventExit);
}
else if (&m_threadMonitor == pThread) {
MonitorService(hEventExit);
}
else if (&m_threadEndingRecord == pThread) {
EndingRecordService(hEventExit);
} return 0;
}