//停止线程
void CVoiceRecordDlg::OnStopService() 

    CVoiceManager mVoiceManager;
    mVoiceManager.isExitThrd  = 1;//子类中无法接收到这个值    if (线程句柄不为空)
    {
        //程序会在这里阻塞!!!!!!
DWORD dwWaitThClose = WaitForSingleObject(mVoiceManager.hThrd,INFINITE); 
BOOL retCloseHandle = CloseHandle(mVoiceManager.hThrd); 
    }
}class CVoiceManager
{ public:
      volatile int isExitThrd;
}CVoiceManager::CVoiceManager()
{ isExitThrd = 0;//初值为0
}
//=================================
//启动线程
void CVoiceManager::StartVoiceThrd()
{ hThrd = CreateThread(NULL, 0, ReceivingThrd, this, 0, &dwID);
}//线程功能函数
void CVoiceManager::ReceivingLoop(void)
{   //isExitThrd无法接收到为1的值
    while(!isExitThrd) 
    {  } //处理任务    DWORD m;
    GetExitCodeThread(线程句柄,&m); //结束线程
    ::ExitThread(m);
}

解决方案 »

  1.   

    //启动线程
    void CVoiceManager::StartVoiceThrd()
    { hThrd = CreateThread(NULL, 0, ReceivingThrd, this, 0, &dwID);
    }DWORD WINAPI CVoiceManager::ReceivingThrd(void * pParam)
    { ASSERT(pParam);
    CVoiceManager * pController = (CVoiceManager*) pParam;
    pController->ReceivingLoop(); 
    return 0;
    }//线程功能函数
    void CVoiceManager::ReceivingLoop(void)
    {  while(!isExitThrd) 
       {}
    }
      

  2.   

    BOOL TerminateThread(
      HANDLE hThread,    // handle to thread
      DWORD dwExitCode   // exit code
    );
      

  3.   

    TerminateThread 无法把资源正常释放掉啊
      

  4.   

        CVoiceManager mVoiceManager;
        mVoiceManager.isExitThrd  = 1;//子类中无法接收到这个值
    你生成一个新变量设置为1有什么用?原先那个变量呢?
      

  5.   

    CVoiceManager mVoiceManager; 
    mVoiceManager.isExitThrd  = 1;//子类中无法接收到这个值//================================================
    CVoiceManager mVoiceManager;  // 这个是临时变量, mVoiceManager并未启动线程;
      

  6.   

    CVoiceManager mVoiceManager; 
    这个对象是在VoiceRecordDlg.h头文件中创建的
      

  7.   

    //停止线程
    void CVoiceRecordDlg::OnStopService() 

        //VoiceRecordDlg头文件冲创建对象CVoiceManager mVoiceManager;
        mVoiceManager.isExitThrd  = 1;//子类中无法接收到这个值    if (线程句柄不为空)
        {
            //程序会在这里阻塞!!!!!!
        DWORD dwWaitThClose = WaitForSingleObject(mVoiceManager.hThrd,INFINITE);             
        BOOL retCloseHandle = CloseHandle(mVoiceManager.hThrd); 
        }
    }class CVoiceManager
    { public:
          volatile int isExitThrd;
    }CVoiceManager::CVoiceManager()
    {    isExitThrd = 0;//初值为0
    }
    //=================================
    //启动线程
    void CVoiceManager::StartVoiceThrd()
    { hThrd = CreateThread(NULL, 0, ReceivingThrd, this, 0, &dwID);
    }//线程功能函数
    void CVoiceManager::ReceivingLoop(void)
    {   //isExitThrd无法接收到为1的值
        while(!isExitThrd) 
        {  } //处理任务    DWORD m;
        GetExitCodeThread(线程句柄,&m); //结束线程
        ::ExitThread(m);
    }
      

  8.   

    isExitThrd 这个变量,
    在线程外部被修改后,无法等到最新的值
      

  9.   

    static类型的变量可以么,或者extern类型的变量?
      

  10.   

    //下面的方式给类的静态变量赋值,是否可以?
    class CVoiceManager
    {
     public:
    static int bFlag;
    }//函数外部给变量赋值
    int CVoiceManager::bFlag = 1;
      

  11.   

    mVoiceManager是个全局变量?把你所有用到mVoiceManager的地方统统改成::mVoiceManager(用针对所有文件的搜索替换),就绝对不会有问题了。