我用的就是多线程
CWinThread *pThread=AfxBeginThread(play,(LPVOID)vKey);UINT play(LPVOID pParam)
{
UINT vKey=(UINT)pParam;
// wave.Stop();
if(vKey==13){
wave.PlayFromRes(IDR_SOUNDCASH,theApp.m_hInstance);
}
else if(vKey==8){
wave.PlayFromRes(IDR_SOUNDTAB,theApp.m_hInstance);
}
else {
wave.PlayFromRes(IDR_WAVE1,theApp.m_hInstance);
}return 0;}   

解决方案 »

  1.   

    这个我碰到过,要使多线程进行同步,可以用CCriticalSection,互斥体,信号量等等
      

  2.   


    main thread  start:
    CRITICAL_SECTION cs;
    InitializeCriticalSection( &cs );a thread :
    EnterCriticalSection( &cs );//will block if b thread already in
    do some function
    LeaveCriticalSection( &cs );b thread :
    EnterCriticalSection( &cs );//will block if a thread already in
    do some function
    LeaveCriticalSection( &cs );
    main thread end:
    DeleteCriticalSection( &cs );
      

  3.   

    我们在开发是经常需要在启动一个进程之后等待其结束后再继续运行。在这里提供了一个名为Wait的函数,它会为你完成上面的功能。实现的思想是在启动进程后等待其结束,由于进程是一种资源,而资源的句柄在WIN32中可以作为核心量使用。你可以使用WaitForSingleObject等待核心量状态改变为有信号状态。对进程来讲当进程结束时其状态转变为有信号。在本例中使用了一个单独的线程来启动进程并等待结束。Wait()
    BOOL Wait(CString szCmdLine)
    {
        LPTHREADINFO pThreadInfo = new THREADINFO;
        CEvent *pThreadEvent = new CEvent(FALSE, TRUE); 
        ASSERT_VALID(pThreadEvent);
        if(pThreadInfo)
        {
            pThreadInfo->pTermThreadEvent = pThreadEvent;
            pThreadInfo->strPathName = szCmdLine;        AfxBeginThread(LaunchAndWait, pThreadInfo);
            WaitForSingleObject(pThreadEvent->m_hObject, INFINITE);
            return TRUE;
        }
        return FALSE;
    }LaunchAndWait()
    UINT LaunchAndWait(LPVOID pParam)
    {
        LPTHREADINFO pThreadInfo = (LPTHREADINFO) pParam;
        PROCESS_INFORMATION stProcessInfo;
        if(LaunchApplication(pThreadInfo->strPathName, &stProcessInfo))
        {
            HANDLE hThreads[2];
            hThreads[0] = pThreadInfo->pTermThreadEvent->m_hObject;
            hThreads[1] = stProcessInfo.hProcess;
            DWORD dwIndex = WaitForMultipleObjects(2, hThreads, FALSE, INFINITE);
            CloseHandle(stProcessInfo.hThread);
            CloseHandle(stProcessInfo.hProcess);
            pThreadInfo->pTermThreadEvent->SetEvent();
            if(pThreadInfo)
                delete pThreadInfo;
        }
        else
            pThreadInfo->pTermThreadEvent->SetEvent();
        return 0;
    }
    LaunchApplication()
    BOOL LaunchApplication(LPCTSTR pCmdLine, PROCESS_INFORMATION *pProcessInfo)
    {
        STARTUPINFO stStartUpInfo;    memset(&stStartUpInfo, 0, sizeof(STARTUPINFO));    stStartUpInfo.cb = sizeof(STARTUPINFO);    stStartUpInfo.dwFlags = STARTF_USESHOWWINDOW;
        stStartUpInfo.wShowWindow = SW_SHOWDEFAULT;    return CreateProcess(NULL, (LPTSTR)pCmdLine, NULL, NULL, FALSE,
            NORMAL_PRIORITY_CLASS, NULL, 
            NULL, &stStartUpInfo, pProcessInfo);
    }