[Assorted-commits] SF.net SVN: assorted:[1218] sandbox/trunk/src/cc/method_thread.cc
Brought to you by:
yangzhang
From: <yan...@us...> - 2009-02-22 06:40:44
|
Revision: 1218 http://assorted.svn.sourceforge.net/assorted/?rev=1218&view=rev Author: yangzhang Date: 2009-02-22 06:40:38 +0000 (Sun, 22 Feb 2009) Log Message: ----------- added method_thread demo Added Paths: ----------- sandbox/trunk/src/cc/method_thread.cc Added: sandbox/trunk/src/cc/method_thread.cc =================================================================== --- sandbox/trunk/src/cc/method_thread.cc (rev 0) +++ sandbox/trunk/src/cc/method_thread.cc 2009-02-22 06:40:38 UTC (rev 1218) @@ -0,0 +1,141 @@ +// Demo of how to start a thread in a method. +// This code originally came from PDOS projects. + + /** + * Run a method in pthread. + * \return The new pthread_t on success, 0 on failure. + */ + template <class C> pthread_t + method_thread(C *o, void (C::*m)()) + { + class runnable { + public: + C *o; + void (C::*m)(); + static void *run(void *vvv) { + runnable *r = (runnable*)vvv; + C *o = r->o; + void (C::*m)() = r->m; + delete r; + (o->*m)(); + return 0; + } + }; + runnable *r = new runnable; + r->o = o; + r->m = m; + pthread_t th; + if(pthread_create(&th, NULL, &runnable::run, (void *) r) == 0){ + return th; + } + return 0; + } + + /** + * Run a method in pthread. + * \return The new pthread_t on success, 0 on failure. + */ + template <class C, class A> pthread_t + method_thread(C *o, void (C::*m)(A), A a) + { + class runnable { + public: + C *o; + void (C::*m)(A a); + A a; + static void *run(void *vvv) { + runnable *r = (runnable*)vvv; + C *o = r->o; + void (C::*m)(A ) = r->m; + A a = r->a; + delete r; + (o->*m)(a); + return 0; + } + }; + runnable *r = new runnable; + r->o = o; + r->m = m; + r->a = a; + pthread_t th; + if(pthread_create(&th, NULL, &runnable::run, (void *) r) == 0){ + return th; + } + return 0; + } + + /** + * Run a method in pthread. + * \return The new pthread_t on success, 0 on failure. + */ + template <class C, class A1, class A2> pthread_t + method_thread(C *o, void (C::*m)(A1 , A2 ), A1 a1, A2 a2) + { + class runnable { + public: + C *o; + void (C::*m)(A1 a1, A2 a2); + A1 a1; + A2 a2; + static void *run(void *vvv) { + runnable *r = (runnable*)vvv; + C *o = r->o; + void (C::*m)(A1 , A2 ) = r->m; + A1 a1 = r->a1; + A2 a2 = r->a2; + delete r; + (o->*m)(a1, a2); + return 0; + } + }; + runnable *r = new runnable; + r->o = o; + r->m = m; + r->a1 = a1; + r->a2 = a2; + pthread_t th; + if(pthread_create(&th, NULL, &runnable::run, (void *) r) == 0){ + return th; + } + return 0; + } + + /** + * Run a method in pthread. + * \return The new pthread_t on success, 0 on failure. + */ + template <class C, class A1, class A2, class A3> pthread_t + method_thread(C *o, void (C::*m)(A1 , A2, A3), A1 a1, A2 a2, A3 a3) + { + class runnable { + public: + C *o; + void (C::*m)(A1 a1, A2 a2, A3 a3); + A1 a1; + A2 a2; + A3 a3; + static void *run(void *vvv) { + runnable *r = (runnable*)vvv; + C *o = r->o; + void (C::*m)(A1, A2, A3) = r->m; + A1 a1 = r->a1; + A2 a2 = r->a2; + A3 a3 = r->a3; + delete r; + (o->*m)(a1, a2, a3); + return 0; + } + }; + runnable *r = new runnable; + r->o = o; + r->m = m; + r->a1 = a1; + r->a2 = a2; + r->a3 = a3; + pthread_t th; + if(pthread_create(&th, NULL, &runnable::run, (void *) r) == 0){ + return th; + } + return 0; + } + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |