1 /* 2 ** helperthread.h 3 ** 4 **--------------------------------------------------------------------------- 5 ** Copyright 1998-2006 Randy Heit 6 ** All rights reserved. 7 ** 8 ** Redistribution and use in source and binary forms, with or without 9 ** modification, are permitted provided that the following conditions 10 ** are met: 11 ** 12 ** 1. Redistributions of source code must retain the above copyright 13 ** notice, this list of conditions and the following disclaimer. 14 ** 2. Redistributions in binary form must reproduce the above copyright 15 ** notice, this list of conditions and the following disclaimer in the 16 ** documentation and/or other materials provided with the distribution. 17 ** 3. The name of the author may not be used to endorse or promote products 18 ** derived from this software without specific prior written permission. 19 ** 20 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 **--------------------------------------------------------------------------- 31 ** 32 */ 33 34 #ifndef __HELPERTHREAD_H__ 35 #define __HELPERTHREAD_H__ 36 37 #define WIN32_LEAN_AND_MEAN 38 #include <windows.h> 39 40 class FHelperThread 41 { 42 struct Message 43 { 44 DWORD Method; 45 DWORD Parm1, Parm2, Parm3; 46 HANDLE CompletionEvent; // Set to signalled when message is finished processing 47 DWORD Return; 48 }; 49 50 enum { MSG_QUEUE_SIZE = 8 }; 51 52 public: 53 FHelperThread (); 54 virtual ~FHelperThread (); 55 void DestroyThread (); 56 57 bool LaunchThread (); 58 DWORD SendMessage (DWORD method, DWORD parm1, DWORD parm2, 59 DWORD parm3, bool wait); 60 bool HaveThread () const; 61 62 protected: 63 enum EThreadEvents { THREAD_NewMessage, THREAD_KillSelf }; Init()64 virtual bool Init () { return true; } Deinit()65 virtual void Deinit () {} DefaultDispatch()66 virtual void DefaultDispatch () {} 67 virtual DWORD Dispatch (DWORD method, DWORD parm1=0, DWORD parm2=0, DWORD parm3=0) = 0; 68 virtual const char *ThreadName () = 0; 69 70 HANDLE ThreadHandle; 71 DWORD ThreadID; 72 HANDLE Thread_Events[2]; 73 CRITICAL_SECTION Thread_Critical; 74 Message Messages[MSG_QUEUE_SIZE]; 75 DWORD MessageHead; 76 DWORD MessageTail; 77 78 private: 79 void ReleaseSynchronizers (); 80 static DWORD WINAPI ThreadLaunch (LPVOID me); 81 82 DWORD ThreadLoop (); 83 }; 84 85 #endif //__HELPERTHREAD_H__ 86