mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-15 05:38:50 +08:00
152 lines
3.2 KiB
C++
152 lines
3.2 KiB
C++
#pragma once
|
|
|
|
#include "atldefine.h"
|
|
|
|
//------------------------------------------------------------------------------------------------------
|
|
// CBaseThread
|
|
//------------------------------------------------------------------------------------------------------
|
|
// Àáñòðàêòíûé êëàññ, êîòîðûé ðåàëèçóåò ðàáîòó ñ ïîòîêîì
|
|
//------------------------------------------------------------------------------------------------------
|
|
|
|
class CBaseThread
|
|
{
|
|
public :
|
|
|
|
CBaseThread ( DWORD_PTR dwAffinityMask = 0 )
|
|
: m_bRunThread ( FALSE )
|
|
, m_hThread ( NULL )
|
|
, m_lPercents ( 0 )
|
|
, m_lError ( NO_ERROR )
|
|
, m_sError ( "" )
|
|
, m_dwAffinityMask ( dwAffinityMask )
|
|
, m_bSuspend ( FALSE )
|
|
{
|
|
if ( 0 == m_dwAffinityMask )
|
|
{
|
|
DWORD_PTR dwProcessAffinityMask = 0;
|
|
DWORD_PTR dwSystemAffinityMask = 0;
|
|
if ( GetProcessAffinityMask ( GetCurrentProcess (), &dwProcessAffinityMask, &dwSystemAffinityMask ) )
|
|
m_dwAffinityMask = dwProcessAffinityMask;
|
|
}
|
|
}
|
|
|
|
virtual ~CBaseThread ()
|
|
{
|
|
StopWork ();
|
|
}
|
|
virtual void StartWork ( LONG lPriority )
|
|
{
|
|
// Åñëè ïîòîê çàïóùåí - âûõîäèì
|
|
if ( m_bRunThread )
|
|
return;
|
|
|
|
m_lPercents = 0;
|
|
m_lError = NO_ERROR;
|
|
m_sError = "";
|
|
|
|
m_bSuspend = FALSE;
|
|
StartThread ();
|
|
|
|
SetThreadPriority ( m_hThread, lPriority );
|
|
m_lThreadPriority = lPriority;
|
|
}
|
|
virtual void SuspendWork ()
|
|
{
|
|
m_bSuspend = TRUE;
|
|
}
|
|
virtual void ResumeWork ()
|
|
{
|
|
m_bSuspend = FALSE;
|
|
}
|
|
virtual void StopWork ()
|
|
{
|
|
if ( !m_bRunThread )
|
|
return;
|
|
|
|
m_bRunThread = FALSE;
|
|
if ( NULL != m_hThread )
|
|
WaitForSingleObject ( m_hThread, INFINITE );
|
|
|
|
RELEASEHANDLE ( m_hThread );
|
|
}
|
|
virtual void WaitThread ()
|
|
{
|
|
if ( !m_bRunThread )
|
|
return;
|
|
|
|
if ( NULL != m_hThread )
|
|
WaitForSingleObject ( m_hThread, INFINITE );
|
|
|
|
m_bRunThread = FALSE;
|
|
|
|
RELEASEHANDLE ( m_hThread );
|
|
}
|
|
|
|
BOOL IsSuspended () const
|
|
{
|
|
return m_bSuspend;
|
|
}
|
|
BOOL IsRunned () const
|
|
{
|
|
return m_bRunThread;
|
|
}
|
|
LONG GetPercents () const
|
|
{
|
|
return m_lPercents;
|
|
}
|
|
LONG GetError () const
|
|
{
|
|
return m_lError;
|
|
}
|
|
CString GetErrorString () const
|
|
{
|
|
return m_sError;
|
|
}
|
|
HANDLE GetHandle ()
|
|
{
|
|
return m_hThread;
|
|
}
|
|
LONG GetPriority () const
|
|
{
|
|
return GetThreadPriority ( m_hThread );
|
|
}
|
|
|
|
protected :
|
|
|
|
void StartThread ()
|
|
{
|
|
DWORD dwTmp;
|
|
m_bRunThread = TRUE;
|
|
m_hThread = CreateThread ( NULL, 0, &_ThreadProc, ( LPVOID ) this, 0, &dwTmp );
|
|
SetThreadAffinityMask ( m_hThread, m_dwAffinityMask );
|
|
}
|
|
void CheckSuspend ()
|
|
{
|
|
// Åëñè ïîòîê ïðèîñòàíîâëåí è çàïóùåí, òî çàñûïàåì íà 10 ìñ
|
|
while ( m_bSuspend && m_bRunThread )
|
|
Sleep ( 10 );
|
|
}
|
|
static DWORD WINAPI CBaseThread::_ThreadProc ( LPVOID pv )
|
|
{
|
|
CBaseThread *pThis = ( CBaseThread* ) pv;
|
|
return pThis->ThreadProc ();
|
|
}
|
|
virtual DWORD ThreadProc () = 0;
|
|
|
|
protected :
|
|
|
|
HANDLE m_hThread; // Óêàçàòåëü íà ïîòîê
|
|
|
|
BOOL m_bRunThread; // Çàïóùåí ëè ïîòîê
|
|
BOOL m_bSuspend; // Ïðèîñòàíîâëåí ëè ïîòîê
|
|
|
|
DWORD_PTR m_dwAffinityMask; // Ìàñêà ïîòîêà
|
|
|
|
LONG m_lError; // Îøèáêà
|
|
CString m_sError; // Îïèñàíèå îøèáêè
|
|
|
|
LONG m_lThreadPriority; // Ïðèîðèòåò ïîòîêà
|
|
LONG m_lPercents; // Ïðîöåíòû
|
|
};
|
|
|