mirror of
https://github.com/celisej567/source-engine.git
synced 2026-01-04 18:09:53 +03:00
1
This commit is contained in:
123
utils/vmpi/testapps/MessageWatch/win_idle.cpp
Normal file
123
utils/vmpi/testapps/MessageWatch/win_idle.cpp
Normal file
@@ -0,0 +1,123 @@
|
||||
//========= 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);
|
||||
}
|
||||
Reference in New Issue
Block a user