12 #ifndef ECL_THREADS_THREAD_WIN_HPP_ 13 #define ECL_THREADS_THREAD_WIN_HPP_ 20 #if defined(ECL_IS_WIN32) 27 #include "thread_exceptions_pos.hpp" 28 #include <ecl/config/macros.hpp> 29 #include <ecl/concepts/nullary_function.hpp> 30 #include <ecl/exceptions/standard_exception.hpp> 31 #include <ecl/utilities/void.hpp> 32 #include <ecl/utilities/function_objects.hpp> 33 #include "priority_win.hpp" 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>
295 Thread(
void (C::*function)(), C &c, const
Priority &priority = DefaultPriority, const
long &stack_size = -1 )
ecl_debug_throw_decl(StandardException);
306 template <typename C>
307 Error start(
void (C::*function)(), C &c, const
Priority &priority = DefaultPriority, const
long &stack_size = -1 )
ecl_debug_throw_decl(StandardException);
347 template <typename F>
348 Thread(const F &function, const
Priority &priority = DefaultPriority, const
long &stack_size = -1 )
ecl_debug_throw_decl(StandardException);
358 template <typename F>
359 Error start(const F &function, const
Priority &priority = DefaultPriority, const
long &stack_size = -1 )
ecl_debug_throw_decl(StandardException);
376 bool isRunning() {
if ( thread_task == NULL ) {
return false; }
else {
return true; } }
404 HANDLE thread_handle;
405 threads::ThreadTaskBase *thread_task;
411 enum ThreadProperties {
412 DefaultStackSize = -1
420 template <
typename C>
425 join_requested(false)
427 start<C>(
function, c, priority, stack_size);
431 template <
typename F>
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)
ecl_debug_throw_decl(StandardException)
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) {
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);
499 template <
typename F>
511 thread_task =
new threads::ThreadTask<F, is_reference_wrapper<F>::value >(
function, priority);
515 thread_handle = CreateThread(NULL,
522 if (!thread_handle) {
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);
#define LOC
Stringify the line of code you are at.
Pre-processed macro definitions that define the target platform.
#define ecl_threads_PUBLIC
BoundUnaryFreeFunction< A, R > generateFunctionObject(R(*function)(A), I &a)
Generate a nullary function object from a bound unary global/static function.
static bool const value
The value for this integral constant wrapper.
#define ecl_assert_throw_decl(exception)
Assure throw exception declaration.
#define ecl_compile_time_concept_check(Model)
Compile time concept checking assertion.
#define ecl_debug_throw_decl(exception)
Debug mode throw exception declaration.
#define ecl_debug_throw(exception)
Debug mode exception throw.
Virtual interface definition for nullary function objects.