2012-06-14 09:06:06 -04:00
|
|
|
|
2012-09-23 17:23:33 -04:00
|
|
|
// IsThread.h
|
2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
// 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:
|
2013-08-11 12:46:49 -04:00
|
|
|
/// This is the main thread entrypoint
|
|
|
|
virtual void Execute(void) = 0;
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-08-11 12:46:49 -04:00
|
|
|
/// The overriden Execute() method should check this value periodically and terminate if this is true
|
|
|
|
volatile bool m_ShouldTerminate;
|
2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
public:
|
|
|
|
cIsThread(const AString & iThreadName);
|
|
|
|
~cIsThread();
|
|
|
|
|
2013-08-11 12:46:49 -04:00
|
|
|
/// Starts the thread; returns without waiting for the actual start
|
|
|
|
bool Start(void);
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-08-11 13:40:15 -04:00
|
|
|
/// Signals the thread to terminate and waits until it's finished
|
|
|
|
void Stop(void);
|
|
|
|
|
2013-08-11 12:46:49 -04:00
|
|
|
/// Waits for the thread to finish. Doesn't signalize the ShouldTerminate flag
|
|
|
|
bool Wait(void);
|
|
|
|
|
|
|
|
/// Returns the OS-dependent thread ID for the caller's thread
|
|
|
|
static unsigned long GetCurrentID(void);
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-09-21 14:44:16 -04:00
|
|
|
protected:
|
2012-06-14 09:06:06 -04:00
|
|
|
AString m_ThreadName;
|
|
|
|
|
2013-11-13 16:54:01 -05:00
|
|
|
// Value used for "no handle":
|
|
|
|
#ifdef _WIN32
|
|
|
|
#define NULL_HANDLE NULL
|
|
|
|
#else
|
|
|
|
#define NULL_HANDLE 0
|
|
|
|
#endif
|
|
|
|
|
2012-06-14 09:06:06 -04:00
|
|
|
#ifdef _WIN32
|
|
|
|
|
|
|
|
HANDLE m_Handle;
|
|
|
|
|
|
|
|
static DWORD_PTR __stdcall thrExecute(LPVOID a_Param)
|
|
|
|
{
|
2013-11-13 16:54:01 -05:00
|
|
|
// Create a window so that the thread can be identified by 3rd party tools:
|
2013-08-11 14:22:42 -04:00
|
|
|
HWND IdentificationWnd = CreateWindow("STATIC", ((cIsThread *)a_Param)->m_ThreadName.c_str(), 0, 0, 0, 0, WS_OVERLAPPED, NULL, NULL, NULL, NULL);
|
2013-11-13 16:54:01 -05:00
|
|
|
|
|
|
|
// Run the thread:
|
2012-06-14 09:06:06 -04:00
|
|
|
((cIsThread *)a_Param)->Execute();
|
2013-11-13 16:54:01 -05:00
|
|
|
|
|
|
|
// Destroy the identification window:
|
2013-08-11 14:22:42 -04:00
|
|
|
DestroyWindow(IdentificationWnd);
|
2013-11-13 16:54:01 -05:00
|
|
|
|
2012-06-14 09:06:06 -04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#else // _WIN32
|
|
|
|
|
|
|
|
pthread_t m_Handle;
|
|
|
|
|
|
|
|
static void * thrExecute(void * a_Param)
|
|
|
|
{
|
|
|
|
((cIsThread *)a_Param)->Execute();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // else _WIN32
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif // CISTHREAD_H_INCLUDED
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|