#include "StdAfx.h"
#include <windows.h>
#include "SysThread.h"

SysThread::SysThread(const char* name, SysThread::Priority priority, UINT32 stacksize)
:  m_Handle(0),
   m_Priority(priority),
   m_u32Stacksize(stacksize),
   m_pFunction(0),
   m_pArgument(0)
{
	strcpy_s( m_strName, name );
}


SysThread::~SysThread(void)
{
   ::TerminateThread( m_Handle, 0 );
}


void SysThread::Start( void (*function)(void*), void *argument )
{
   DWORD id;    
   m_pFunction = function;
   m_pArgument = argument;

   m_Handle = ::CreateThread(NULL, m_u32Stacksize, (LPTHREAD_START_ROUTINE)Startfunc, this, 0, &id);
   SetPriority( m_Priority );
}

void SysThread::SetPriority( SysThread::Priority priority )
{
   ::SetThreadPriority( m_Handle, (int)priority );
   ::SetThreadPriorityBoost( m_Handle, true );   // disable dynamic boosting
}

unsigned long SysThread::Startfunc( SysThread *pSysThread )
{
   (*pSysThread->m_pFunction)(pSysThread->m_pArgument);
   return 0;
}

