예제 #1
0
STDMETHODIMP DDTaskManager::CreateTask(/* in */ DWORD dwStackSize, /* in */ LPTHREAD_START_ROUTINE pStartAddress, /* in */ PVOID pParameter, /* out */ IHostTask **ppTask) {
    DWORD dwThreadId;
    HANDLE hThread = CreateThread(
        NULL,
        dwStackSize,
        pStartAddress,
        pParameter,
        CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
        &dwThreadId);

    IHostTask* task = new DDTask(hThread);
    if (!task) {
        _ASSERTE(!"Failed to allocate task");
        *ppTask = NULL;
        return E_OUTOFMEMORY;
    }

	m_pThreadMapCrst->Enter();    
	m_pThreadMap->insert(map<DWORD, IHostTask*>::value_type(dwThreadId, task));

	ThreadInfo info;
	info.threadHandle = hThread;
	info.threadId = dwThreadId;
	m_pContext->GetTasksList()->insert(m_pContext->GetTasksList()->begin(), list<ThreadInfo>::value_type(info));		
	m_pThreadMapCrst->Exit();

    task->AddRef();
    *ppTask = task;

    return S_OK;
}
예제 #2
0
파일: TaskMgr.cpp 프로젝트: ppatoria/cpp
STDMETHODIMP DHTaskManager::CreateTask(/* in */ DWORD dwStackSize, /* in */ LPTHREAD_START_ROUTINE pStartAddress, /* in */ PVOID pParameter, /* out */ IHostTask **ppTask)
{
    DWORD dwThreadId;
    HANDLE hThread = CreateThread(
        NULL,
        dwStackSize,
        pStartAddress,
        pParameter,
        CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
        &dwThreadId);

    IHostTask* task = new DHTask(this, hThread);
    if (!task)
    {
        _ASSERTE(!"Failed to allocate task");
        *ppTask = NULL;
        return E_OUTOFMEMORY;
    }

    CrstLock crst(m_pThreadMapCrst);
    m_pThreadMap->insert(map<DWORD, IHostTask*>::value_type(dwThreadId, task));
    crst.Exit();

    task->AddRef();
    *ppTask = task;

    return S_OK;
}