UniSet
1.4.0
|
00001 /* This file is part of the UniSet project 00002 * Copyright (c) 2002 Free Software Foundation, Inc. 00003 * Copyright (c) 2002 Pavel Vainerman 00004 * 00005 * This program is free software; you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License as published by 00007 * the Free Software Foundation; either version 2 of the License, or 00008 * (at your option) any later version. 00009 * 00010 * This program is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 * GNU General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU General Public License 00016 * along with this program; if not, write to the Free Software 00017 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00018 */ 00019 // -------------------------------------------------------------------------- 00024 // -------------------------------------------------------------------------- 00025 #ifndef OmniThreadCreator_h_ 00026 #define OmniThreadCreator_h_ 00027 //--------------------------------------------------------------------------- 00028 #include <omnithread.h> 00029 //---------------------------------------------------------------------------- 00089 //---------------------------------------------------------------------------------------- 00090 template<class ThreadMaster> 00091 class OmniThreadCreator: 00092 public omni_thread 00093 { 00094 public: 00095 00097 typedef void(ThreadMaster::* Action)(void*); 00098 00099 OmniThreadCreator( ThreadMaster* m, Action a, bool undetached=false ); 00100 ~OmniThreadCreator(){}; 00101 00102 protected: 00103 void* run_undetached(void *x) 00104 { 00105 if(m) 00106 (m->*act)(x); 00107 00108 return (void*)0; 00109 } 00110 00111 virtual void run(void* arg) 00112 { 00113 if(m) 00114 (m->*act)(arg); 00115 } 00116 00117 private: 00118 OmniThreadCreator(); 00119 ThreadMaster* m; 00120 Action act; 00121 }; 00122 00123 //---------------------------------------------------------------------------------------- 00124 template <class ThreadMaster> 00125 OmniThreadCreator<ThreadMaster>::OmniThreadCreator( ThreadMaster* m, Action a, bool undetach ): 00126 omni_thread(), 00127 m(m), 00128 act(a) 00129 { 00130 if(undetach) 00131 start_undetached(); 00132 } 00133 //---------------------------------------------------------------------------------------- 00134 00135 template <class ThreadMaster> 00136 OmniThreadCreator<ThreadMaster>::OmniThreadCreator(): 00137 m(0), 00138 act(0) 00139 { 00140 } 00141 //---------------------------------------------------------------------------------------- 00142 00143 #endif // OmniThreadCreator_h_