WindowsXP-SP1/enduser/stuff/hhctrl/thread.cpp
2020-09-30 16:53:49 +02:00

123 lines
2.8 KiB
C++

// Copyright (C) 1996-1997 Microsoft Corporation. All rights reserved.
#include "header.h"
static DWORD thrdID;
static HANDLE hThrd;
static HANDLE hsemThread;
static int ThreadPriority;
static THRD_COMMAND ThreadCommand;
static void* pThreadParam;
static DWORD WINAPI WorkerThread(LPVOID pParam);
BOOL ActivateThread(THRD_COMMAND cmd, void* pParam, int priority)
{
if (!hThrd) {
if (cmd == THRD_TERMINATE) // don't start the thread just to kill it
return FALSE;
if (!hsemThread)
hsemThread = CreateSemaphore(NULL, 0, 1, NULL);
hThrd = CreateThread(NULL, 0, &WorkerThread, NULL,
0, &thrdID);
if (!hThrd) {
OOM();
return FALSE;
}
SetThreadPriority(hThrd, ThreadPriority = priority);
}
if (g_fThreadRunning)
return FALSE;
if (g_fDualCPU == -1) { // haven't initialized it yet
HKEY hkey;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\1", 0,
KEY_READ, &hkey) == ERROR_SUCCESS) {
g_fDualCPU = TRUE;
RegCloseKey(hkey);
}
else
g_fDualCPU = FALSE;
}
// For multiple CPU's, we can use a normal priority for threads
if (g_fDualCPU && (priority == THREAD_PRIORITY_IDLE ||
priority == THREAD_PRIORITY_LOWEST ||
priority == THREAD_PRIORITY_BELOW_NORMAL))
priority = THREAD_PRIORITY_NORMAL;
if (ThreadPriority != priority)
SetThreadPriority(hThrd, ThreadPriority = priority);
ThreadCommand = cmd;
pThreadParam = pParam;
g_fThreadRunning = TRUE;
ReleaseSemaphore(hsemThread, 1, NULL);
return TRUE;
}
/***************************************************************************
FUNCTION: WaitForThread
PURPOSE: Find out if the worker thread is running. If it is, and
the command is anything other then THRD_ANY, then kick
up the thread priority and wait for it to finish.
PARAMETERS:
cmd
RETURNS:
COMMENTS:
MODIFICATION DATES:
04-Jun-1997 [ralphw]
***************************************************************************/
BOOL WaitForThread(THRD_COMMAND cmd)
{
if (!g_fThreadRunning)
return TRUE;
else if (cmd != THRD_ANY && cmd != ThreadCommand)
return FALSE;
// Kick the thread to a high priority, and wait for it to complete
SetThreadPriority(hThrd, THREAD_PRIORITY_HIGHEST);
{
CHourGlass waitcur;
while (g_fThreadRunning)
Sleep(200);
}
SetThreadPriority(hThrd, ThreadPriority);
return TRUE;
}
static DWORD WINAPI WorkerThread(LPVOID pParam)
{
for (;;) {
if (WaitForSingleObject(hsemThread, INFINITE) != WAIT_OBJECT_0)
return (UINT) -1;
switch (ThreadCommand) {
case THRD_TERMINATE:
g_fThreadRunning = FALSE;
thrdID = 0;
hThrd = NULL;
ExitThread(0);
break;
}
g_fThreadRunning = FALSE;
}
}