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