我用的就是多线程
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;}
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;}
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 );
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);
}