12 #ifndef ECL_THREADS_THREAD_WIN_HPP_ 
   13 #define ECL_THREADS_THREAD_WIN_HPP_ 
   19 #include <ecl/config/ecl.hpp> 
   20 #if defined(ECL_IS_WIN32) 
   53         virtual ~ThreadTaskBase() {};
 
   56         ThreadTaskBase(
const Priority& priority) : priority_level(priority) {}; 
 
   68 template <
typename F, 
bool IsReferenceWrapper = false>
 
   69 class ECL_LOCAL ThreadTask : 
public ThreadTaskBase {
 
   79         ThreadTask(
const F &
f, 
const Priority &priority) : ThreadTaskBase(priority), function(
f) {
 
   82         virtual ~ThreadTask() {}; 
 
   94         static unsigned int EntryPoint(
void *ptr_this) {
 
   95             ThreadTask< F, false > *ptr = 
static_cast< ThreadTask< F, false > * 
>(ptr_this);
 
  113 template <
typename F>
 
  114 class ECL_LOCAL ThreadTask<F, true> : 
public ThreadTaskBase {
 
  124         ThreadTask(
const F &
f, 
const Priority &priority) : ThreadTaskBase(priority), function(
f.reference()) {
 
  127         virtual ~ThreadTask() {}; 
 
  138         static unsigned int EntryPoint(
void *ptr_this) {
 
  139             ThreadTask< F, true > *ptr = 
static_cast< ThreadTask< F, true > * 
>(ptr_this);
 
  145         typename F::type &
function;
 
  239                 join_requested(false)
 
  294         template <
typename C>
 
  306         template <
typename C>
 
  307         Error start(
void (C::*
function)(), C &c, 
const Priority &priority = 
DefaultPriority,  
const long &stack_size = -1 );
 
  347         template <
typename F>
 
  358         template <
typename F>
 
  376         bool isRunning() { 
if ( thread_task == NULL ) { 
return false; } 
else { 
return true; } }
 
  404         HANDLE thread_handle;
 
  405     threads::ThreadTaskBase *thread_task;
 
  409         void initialise(
const long &stack_size);
 
  411         enum ThreadProperties {
 
  412                 DefaultStackSize = -1
 
  420 template <
typename C>
 
  421 Thread::Thread(
void (C::*
function)(), C &c, 
const Priority &priority, 
const long &stack_size) :
 
  425         join_requested(false)
 
  427         start<C>(
function, c, priority, stack_size);
 
  431 template <
typename F>
 
  432 Thread::Thread(
const F &
function, 
const Priority &priority, 
const long &stack_size) :
 
  436         join_requested(false)
 
  438         start<F>(
function, priority, stack_size);
 
  441 template <
typename C>
 
  442 Error Thread::start(
void (C::*
function)(), C &c, 
const Priority &priority, 
const long &stack_size)
 
  447                 ecl_debug_throw(StandardException(LOC,BusyError,
"The thread has already been started."));
 
  448                 return Error(BusyError); 
 
  453         thread_task = 
new threads::ThreadTask< BoundNullaryMemberFunction<C,void> >(
generateFunctionObject( 
function, c ), priority);
 
  457     thread_handle = CreateThread(NULL,
 
  459         (LPTHREAD_START_ROUTINE)threads::ThreadTask< BoundNullaryMemberFunction<C,void> >::EntryPoint,
 
  464     if (!thread_handle) {
 
  465         ecl_debug_throw(StandardException(LOC, UnknownError, 
"Failed to create thread."));
 
  466         return Error(UnknownError);
 
  469     BOOL bResult = FALSE;
 
  472         bResult = SetThreadPriority(thread_handle, THREAD_PRIORITY_TIME_CRITICAL);
 
  477                 bResult = SetThreadPriority(thread_handle, HIGH_PRIORITY_CLASS);
 
  480                 bResult = SetThreadPriority(thread_handle, THREAD_PRIORITY_ABOVE_NORMAL);
 
  483                 bResult = SetThreadPriority(thread_handle, THREAD_PRIORITY_BELOW_NORMAL);
 
  486                 bResult = SetThreadPriority(thread_handle, THREAD_PRIORITY_IDLE);
 
  496     return Error(NoError);
 
  499 template <
typename F>
 
  500 Error Thread::start(
const F &
function, 
const Priority &priority, 
const long &stack_size)
 
  505                 ecl_debug_throw(StandardException(LOC,BusyError,
"The thread has already been started."));
 
  506                 return Error(BusyError); 
 
  511         thread_task = 
new threads::ThreadTask<F, is_reference_wrapper<F>::value >(
function, priority);
 
  515     thread_handle = CreateThread(NULL,
 
  517         (LPTHREAD_START_ROUTINE)threads::ThreadTask<F, is_reference_wrapper<F>::value >::EntryPoint,
 
  522     if (!thread_handle) {
 
  523         ecl_debug_throw(StandardException(LOC, UnknownError, 
"Failed to create thread."));
 
  524         return Error(UnknownError);
 
  527     BOOL bResult = FALSE;
 
  530         bResult = SetThreadPriority(thread_handle, THREAD_PRIORITY_TIME_CRITICAL);
 
  535                 bResult = SetThreadPriority(thread_handle, HIGH_PRIORITY_CLASS);
 
  538                 bResult = SetThreadPriority(thread_handle, THREAD_PRIORITY_ABOVE_NORMAL);
 
  541                 bResult = SetThreadPriority(thread_handle, THREAD_PRIORITY_BELOW_NORMAL);
 
  544                 bResult = SetThreadPriority(thread_handle, THREAD_PRIORITY_IDLE);
 
  554     return Error(NoError);