X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fthread.h;h=2b0766c68ba7fbd0d443265d30d58628ddda76f8;hp=51ca0ef3395c2abe80d182a6cef056429d655e75;hb=727f8ce40806cc2f7c295260f3c9aa156c815c70;hpb=a883560b42163f5ed0c83204469d17dd4f0134b6 diff --git a/source/thread.h b/source/thread.h index 51ca0ef..2b0766c 100644 --- a/source/thread.h +++ b/source/thread.h @@ -6,33 +6,43 @@ Distributed under the LGPL #ifndef MSP_FRAMEWORK_THREAD_H_ #define MSP_FRAMEWORK_THREAD_H_ -#ifdef WIN32 -#include "win32signum.h" -#endif - -#include +#include "types.h" namespace Msp { +/** +Base class for threads. To create a thread for some task, derive it from this +class and implement the main() function. Note that threads are not +automatically started upon creation - you must manually call launch() instead. +This is to allow initializing variables of the derived class before the thread +is started. +*/ class Thread { public: - void *join(); - void kill(int s) { pthread_kill(thread_, s); } + void join(); + void cancel(); + void kill(); virtual ~Thread(); protected: - Thread(): valid_(false) { } - void launch() { if(!valid_) pthread_create(&thread_, 0, &main_, this); } - virtual void *main()=0; - void exit(void *r) { pthread_exit(r); } + Thread(): launched_(false) { } + void launch(); + virtual void main()=0; + void check_cancel(); private: - pthread_t thread_; - bool valid_; + ThreadHandle thread_; + bool launched_; Thread(const Thread &); Thread &operator=(const Thread &); - static void *main_(void *t) { return ((Thread *)t)->main(); } +#ifdef WIN32 +# define THREAD_RETURN_ DWORD WINAPI +#else +# define THREAD_RETURN_ void * +#endif + static THREAD_RETURN_ main_(void *t) { ((Thread *)t)->main(); return 0; } +#undef THREAD_RETURN_ }; } // namespace Msp