windows-nt/Source/XPSP1/NT/enduser/troubleshoot/msinfo/thread.h
2020-09-26 16:20:57 +08:00

67 lines
2.4 KiB
C++

//=============================================================================
// File: thread.h
// Author: a-jammar
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// This header file defines the class used to perform threaded refreshes in
// MSInfo (added late in the game). All refreshes should use this class.
//=============================================================================
#pragma once
class CFolder;
class CSystemInfo;
class CDataGatherer;
//-----------------------------------------------------------------------------
// This structure is used to communicate with the thread function. A pointer is
// passed when the thread function is called. We declare a static instance of
// the struct which will be reused.
//-----------------------------------------------------------------------------
class CThreadingRefresh;
struct SThreadInfo
{
volatile BOOL m_fShowData;
volatile BOOL m_fCancel; // cancel the current refresh, stay in thread
volatile BOOL m_fQuit; // exit the thread
volatile BOOL m_fRecursive; // refresh folders recursively
volatile BOOL m_fSoftRefresh; // if TRUE, don't force a refresh on existing data
CFolder * m_pFolder; // the folder to refresh
CSystemInfo * m_pSysInfo; // CSystemInfo to update when complete
CDataGatherer * m_pGatherer; // use this to refresh the data
CThreadingRefresh * m_pThreadRefresh;
HANDLE m_eventDone; // refresh thread fires when done
HANDLE m_eventStart; // main thread fires when more data
};
//static SThreadInfo threadinfo;
class CThreadingRefresh
{
public:
CThreadingRefresh(CDataGatherer * pGatherer);
~CThreadingRefresh();
BOOL IsRefreshing();
int PerchentageComplete();
void RefreshAll(CFolder * pFolder, volatile BOOL * pfCancel = NULL);
void RefreshFolder(CFolder * pFolder, BOOL fRecursive = FALSE, BOOL fSoftRefresh = FALSE);
void RefreshFolderAsync(CFolder * pFolder, CSystemInfo * pSysInfo, BOOL fRecursive = FALSE, BOOL fSoftRefresh = FALSE);
void CancelRefresh(BOOL fUpdateUI = TRUE);
void KillRefreshThread();
BOOL WaitForRefresh();
BOOL ResultsPaneNotAvailable();
void EnterCriticalSection() { ::EnterCriticalSection(&m_csThreadRefresh); };
void LeaveCriticalSection() { ::LeaveCriticalSection(&m_csThreadRefresh); };
private:
CDataGatherer * m_pGatherer;
HANDLE m_hThread;
DWORD m_dwThreadID;
SThreadInfo * m_pThreadInfo;
CRITICAL_SECTION m_csThreadRefresh;
};