You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
2.4 KiB
123 lines
2.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
// Class for sending idle messages to a window |
|
|
|
#include "stdafx.h" |
|
#include "win_idle.h" |
|
|
|
// Stub function to get into the object's main thread loop |
|
DWORD WINAPI CWinIdle::ThreadStub(LPVOID pIdle) |
|
{ |
|
return ((CWinIdle *)pIdle)->RunIdle(); |
|
} |
|
|
|
CWinIdle::CWinIdle() : |
|
m_hIdleThread(NULL), |
|
m_hIdleEvent(NULL), |
|
m_hStopEvent(NULL), |
|
m_hWnd(0), |
|
m_uMsg(0), |
|
m_dwDelay(0) |
|
{ |
|
} |
|
|
|
CWinIdle::~CWinIdle() |
|
{ |
|
if (m_hIdleThread) |
|
OutputDebugString("!!CWinIdle Warning!! Idle thread not shut down!\n"); |
|
} |
|
|
|
DWORD CWinIdle::RunIdle() |
|
{ |
|
// Set up an event list |
|
HANDLE aEvents[2]; |
|
|
|
aEvents[0] = m_hStopEvent; |
|
aEvents[1] = m_hIdleEvent; |
|
|
|
// Wait for a stop or idle event |
|
while (WaitForMultipleObjects(2, aEvents, FALSE, INFINITE) != WAIT_OBJECT_0) |
|
{ |
|
// Send an idle message |
|
PostMessage(m_hWnd, m_uMsg, m_wParam, m_lParam); |
|
// Wait for a bit... |
|
Sleep(m_dwDelay); |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
BOOL CWinIdle::StartIdle(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam, DWORD dwDelay) |
|
{ |
|
// Make sure it's not already running |
|
if (m_hIdleThread) |
|
return FALSE; |
|
|
|
// Make sure they send in a valid handle.. |
|
if (!hWnd) |
|
return FALSE; |
|
|
|
// Create the events |
|
m_hIdleEvent = CreateEvent(NULL, FALSE, FALSE, NULL); |
|
m_hStopEvent = CreateEvent(NULL, FALSE, FALSE, NULL); |
|
|
|
// Make sure the events got created |
|
if ((!m_hIdleEvent) || (!m_hStopEvent)) |
|
return FALSE; |
|
|
|
// Create the thread |
|
DWORD dwThreadID; |
|
m_hIdleThread = CreateThread(NULL, 0, CWinIdle::ThreadStub, (void *)this, 0, &dwThreadID); |
|
|
|
if (m_hIdleThread) |
|
{ |
|
SetThreadPriority(m_hIdleThread, THREAD_PRIORITY_IDLE); |
|
|
|
m_hWnd = hWnd; |
|
m_uMsg = uMessage; |
|
m_wParam = wParam; |
|
m_lParam = lParam; |
|
|
|
m_dwDelay = dwDelay; |
|
} |
|
|
|
return m_hIdleThread != 0; |
|
} |
|
|
|
BOOL CWinIdle::EndIdle() |
|
{ |
|
// Make sure it's running |
|
if (!m_hIdleThread) |
|
return FALSE; |
|
|
|
// Stop the idle thread |
|
SetEvent(m_hStopEvent); |
|
WaitForSingleObject(m_hIdleThread, INFINITE); |
|
CloseHandle(m_hIdleThread); |
|
|
|
// Get rid of the event objects |
|
CloseHandle(m_hIdleEvent); |
|
CloseHandle(m_hStopEvent); |
|
|
|
// Set everything back to 0 |
|
m_hIdleEvent = 0; |
|
m_hStopEvent = 0; |
|
m_hIdleThread = 0; |
|
|
|
return TRUE; |
|
} |
|
|
|
void CWinIdle::NextIdle() |
|
{ |
|
// Make sure the thread's running |
|
if (!m_hIdleThread) |
|
return; |
|
|
|
// Signal an idle message |
|
SetEvent(m_hIdleEvent); |
|
}
|
|
|