我现在做语音传输可以支持八路的通话,现有一个线程是采集声音然后发送出去。线程调用了一个回调函数voiceThreadPro这个函数。这个函数是实现语音采集然后发送的。我的问题是如果支持八点的啊,我是不是得创建八个线程,这八个线程可以同时调用voiceThreadPro这个函数吗?我还需要维护这八路的通话,那么就需要知道已经创建的线程ID号。我应该如何实现?谢谢大家

解决方案 »

  1.   

    CreatThread创建线程的时候有几个参数可以用来存放相关ID信息,如dwCreationFlags 创建标志,lpThreadId 指向存放线程ID的指针。需要维护的时候可以直接调用指针来对各个线程进行维护。
    另外一种思路是CreatThread本身创建成功后会返回一个线程句柄,那么是否可以使用这个句柄来分别维护你那不同的线程呢。
    上面函数的具体使用方法可以查阅MSDN,希望可以对你有所帮助。
      

  2.   

    voiceThreadPro是可重入函数就可以..........
      

  3.   


    #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;
    }