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);