summaryrefslogtreecommitdiffstats
path: root/source/OSSupport/IsThread.h
blob: ed9a3285212ce94ea99c72f256c35e41cb9a5352 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

// IsThread.h

// Interfaces to the cIsThread class representing an OS-independent wrapper for a class that implements a thread.
// This class will eventually suupersede the old cThread class

/*
Usage:
To have a new thread, declare a class descending from cIsClass.
Then override its Execute() method to provide your thread processing.
In the descending class' constructor call the Start() method to start the thread once you're finished with initialization.
*/





#pragma once
#ifndef CISTHREAD_H_INCLUDED
#define CISTHREAD_H_INCLUDED





class cIsThread
{
protected:
	virtual void Execute(void) = 0;  // This function is called in the new thread's context

	volatile bool m_ShouldTerminate;  // The overriden Execute() method should check this periodically and terminate if this is true
	
public:
	cIsThread(const AString & iThreadName);
	~cIsThread();
	
	bool Start(void);  // Starts the thread
	bool Wait(void);   // Waits for the thread to finish
	
	static unsigned long GetCurrentID(void);  // Returns the OS-dependent thread ID for the caller's thread

private:
	AString m_ThreadName;
	
	#ifdef _WIN32
	
		HANDLE m_Handle;
		
		static DWORD_PTR __stdcall thrExecute(LPVOID a_Param)
		{
			((cIsThread *)a_Param)->Execute();
			return 0;
		}
		
	#else  // _WIN32
	
		pthread_t m_Handle;
		bool      m_HasStarted;
		
		static void * thrExecute(void * a_Param)
		{
			((cIsThread *)a_Param)->Execute();
			return NULL;
		}
		
	#endif  // else _WIN32
	
} ;





#endif  // CISTHREAD_H_INCLUDED