172 lines
3.4 KiB
C++
172 lines
3.4 KiB
C++
/////////////////////////////////////////////////////////////////////////////////////
|
|
// RegExThread.cpp : Implementation of CRegExThread
|
|
// Copyright (c) Microsoft Corporation 1999.
|
|
|
|
#include "stdafx.h"
|
|
#include "RegExThread.h"
|
|
|
|
namespace BDATuningModel {
|
|
|
|
|
|
// --- CBaseThread ----------------------
|
|
|
|
|
|
|
|
|
|
// when the thread starts, it calls this function. We unwrap the 'this'
|
|
//pointer and call ThreadProc.
|
|
DWORD WINAPI
|
|
CBaseThread::InitialThreadProc(LPVOID pv)
|
|
{
|
|
CBaseThread * pThread = (CBaseThread *) pv;
|
|
|
|
HRESULT hrCoInit = CBaseThread::CoInitializeHelper(pThread->m_dwCoInitFlags);
|
|
if(FAILED(hrCoInit)) {
|
|
return hrCoInit;
|
|
}
|
|
|
|
|
|
HRESULT hr = pThread->ThreadProc();
|
|
|
|
if(SUCCEEDED(hrCoInit)) {
|
|
CoUninitialize();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
BOOL
|
|
CBaseThread::Create()
|
|
{
|
|
DWORD threadid;
|
|
|
|
CAutoLock lock(&m_AccessLock);
|
|
|
|
if (ThreadExists()) {
|
|
return FALSE;
|
|
}
|
|
|
|
m_hThread = CreateThread(
|
|
NULL,
|
|
0,
|
|
CBaseThread::InitialThreadProc,
|
|
this,
|
|
0,
|
|
&threadid);
|
|
|
|
if (!m_hThread) {
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
DWORD
|
|
CBaseThread::CallWorker(DWORD dwParam)
|
|
{
|
|
// lock access to the worker thread for scope of this object
|
|
CAutoLock lock(&m_AccessLock);
|
|
|
|
if (!ThreadExists()) {
|
|
return (DWORD) E_FAIL;
|
|
}
|
|
|
|
// set the parameter
|
|
m_dwParam = dwParam;
|
|
|
|
m_dwReturnVal = 0;
|
|
// signal the worker thread
|
|
m_EventSend.Set();
|
|
|
|
// wait for the completion to be signalled or the thread to terminate
|
|
HANDLE h[2];
|
|
h[0] = m_EventComplete;
|
|
h[1] = m_hThread;
|
|
DWORD rc = WaitForMultipleObjects(2, h, 0, INFINITE);
|
|
|
|
// done - this is the thread's return value
|
|
return m_dwReturnVal;
|
|
}
|
|
|
|
|
|
#if 0
|
|
// Wait for a request from the client
|
|
DWORD
|
|
CBaseThread::GetRequest()
|
|
{
|
|
m_EventSend.Wait();
|
|
return m_dwParam;
|
|
}
|
|
#endif
|
|
|
|
// is there a request?
|
|
BOOL
|
|
CBaseThread::CheckRequest(DWORD * pParam)
|
|
{
|
|
if (!m_EventSend.Check()) {
|
|
return FALSE;
|
|
} else {
|
|
if (pParam) {
|
|
*pParam = m_dwParam;
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// reply to the request
|
|
void
|
|
CBaseThread::Reply(DWORD dw)
|
|
{
|
|
m_dwReturnVal = dw;
|
|
|
|
// The request is now complete so CheckRequest should fail from
|
|
// now on
|
|
//
|
|
// This event should be reset BEFORE we signal the client or
|
|
// the client may Set it before we reset it and we'll then
|
|
// reset it (!)
|
|
|
|
m_EventSend.Reset();
|
|
|
|
// Tell the client we're finished
|
|
|
|
m_EventComplete.Set();
|
|
}
|
|
|
|
HRESULT CBaseThread::CoInitializeHelper(DWORD dwCoInitFlags)
|
|
{
|
|
// call CoInitializeEx and tell OLE not to create a window (this
|
|
// thread probably won't dispatch messages and will hang on
|
|
// broadcast msgs o/w).
|
|
//
|
|
// If CoInitEx is not available, threads that don't call CoCreate
|
|
// aren't affected. Threads that do will have to handle the
|
|
// failure. Perhaps we should fall back to CoInitialize and risk
|
|
// hanging?
|
|
//
|
|
|
|
// older versions of ole32.dll don't have CoInitializeEx
|
|
|
|
HRESULT hr = E_FAIL;
|
|
HINSTANCE hOle = GetModuleHandle(TEXT("ole32.dll"));
|
|
if(hOle)
|
|
{
|
|
typedef HRESULT (STDAPICALLTYPE *PCoInitializeEx)(
|
|
LPVOID pvReserved, DWORD dwCoInit);
|
|
PCoInitializeEx pCoInitializeEx =
|
|
(PCoInitializeEx)(GetProcAddress(hOle, "CoInitializeEx"));
|
|
if(pCoInitializeEx)
|
|
{
|
|
hr = (*pCoInitializeEx)(NULL, dwCoInitFlags);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
// end of private copy of dshow stuff
|
|
|
|
};
|
|
// end of file - RegExThread.cpp
|