// Copyright © 1998 by Jon Shemitz, all rights reserved.
// Permission is hereby granted to freely use, modify, and
// distribute this source code PROVIDED that all six lines of
// this copyright and contact notice are included without any
// changes. Questions? Comments? Offers of work?
// mailto:jon@midnightbeach.com - http://www.midnightbeach.com
//---------------------------------------------------------------------------
#ifndef SynchedThreadsH
#define SynchedThreadsH
#include <stdexcept>
//---------------------------------------------------------------------------
// Simple threads
typedef void (__closure *TThreadFunction)(void* Data);
class TSimpleThread : public TThread
{
public:
TSimpleThread( TThreadFunction _Action,
void* _Data = NULL, bool RunNow = True );
void AbortThread();
protected:
TThreadFunction ThreadFunction;
void* Data;
private:
virtual void __fastcall Execute() { ThreadFunction(Data); };
};
TSimpleThread* RunInThread( TThreadFunction Handler,
void* Data = NULL )
{ return new TSimpleThread(Handler, Data); };
// Wait threads (basic synchronization)
void MsgWaitForSingleObject(HANDLE Handle);
TProcessInformation SpawnProcess(char* Command);
class TWaitThread : public TSimpleThread
{
typedef TSimpleThread inherited;
public:
TWaitThread( TThreadFunction _Action, void* _Data = NULL );
void WaitFor() throw (EAbort*) { Run(false); }
void MsgWaitFor() throw (EAbort*) { Run(true); }
void AbortThread();
private:
bool* AbortFlag;
void Run(bool MsgWait = true)
throw (EAbort*);
};
void WaitForThread(TThreadFunction Handler, void* Data = NULL)
throw (EAbort*)
{ (new TWaitThread(Handler, Data))->WaitFor(); };
void MsgWaitForThread( TWaitThread*& Thread,
TThreadFunction Handler, void* Data = NULL)
throw (EAbort*);
// Stop/start threads
class EAbortedThread : public std::runtime_error
{ public: EAbortedThread(); };
class EThreadInUse : public std::logic_error
{ public: EThreadInUse(); };
class TStopStartThread : public TSimpleThread
{
public:
bool Waiting;
TStopStartThread();
virtual __fastcall ~TStopStartThread()
{ CloseHandle(Event); };
void Run( TThreadFunction _Action, void* _Data = NULL,
bool MsgWait = true)
throw (EAbort*, EAbortedThread, EThreadInUse);
void AbortThread();
private:
HANDLE Event;
bool Aborted;
virtual void __fastcall Execute();
};
#endif