I put it into the public domain ;)
If you find any flaws, don't hesitate to contact me, or just put a comment.
I think this code is straightforward and self-explainable.
class Thread {
public:
enum Priority {
LOWEST = THREAD_PRIORITY_LOWEST,
LOW = THREAD_PRIORITY_BELOW_NORMAL,
NORMAL = THREAD_PRIORITY_NORMAL,
HIGH = THREAD_PRIORITY_ABOVE_NORMAL,
HIGHEST = THREAD_PRIORITY_HIGHEST
};
public:
Thread()
: _handle (NULL)
{
}
virtual ~Thread() {
Kill();
}
bool Start(bool suspended = false) {
_running = true;
_suspended = suspended;
DWORD flags = suspended ? CREATE_SUSPENDED : 0;
if (_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)_ThreadFunc, this, flags, &_id)) {
return true;
} else {
_suspended = false;
_running = false;
return false;
}
}
bool Stop(DWORD timeout, bool force = false) {
_running = false;
if (force) {
if (WaitForSingleObject(_handle, timeout) == WAIT_OBJECT_0) {
return true;
} else {
BOOL result = TerminateThread(_handle, 1);
CloseHandle(_handle);
_handle = NULL;
_running = false;
_suspended = false;
return result == TRUE;
}
} else {
return WaitForSingleObject(_handle, timeout) == WAIT_OBJECT_0;
}
}
bool Kill() {
BOOL result = FALSE;
if (_handle) {
result = TerminateThread(_handle, 1);
CloseHandle(_handle);
_handle = NULL;
}
_suspended = false;
return result == TRUE;
}
bool Suspend() {
_suspended = true;
return SuspendThread(_handle) != -1;
}
bool Resume() {
_suspended = false;
return ResumeThread(_handle) != -1;
}
bool Wait(DWORD timeout = INFINITE) {
return WaitForSingleObject(_handle, timeout) == WAIT_OBJECT_0;
}
bool SetPriority(Priority priority) {
return SetThreadPriority(_handle, (DWORD)priority) == TRUE;
}
bool SetIdealProcessor(int index) {
return SetThreadIdealProcessor(_handle, index) != -1;
}
bool ClearCpuAffinity() {
}
bool AddCpuAffinity() {
}
bool IsSuspended() const {
return _suspended;
}
bool IsRunning() const {
return _running;
}
unsigned GetID() const {
return _id;
}
private:
static DWORD WINAPI _ThreadFunc(LPVOID pvThread) {
if (Thread* pThis = (Thread*)pvThread) {
pThis->Run();
pThis->_running = false;
pThis->_suspended = false;
}
return 0;
}
protected:
virtual void Run() = 0;
private:
HANDLE _handle;
DWORD _id;
bool _suspended;
volatile bool _running;
};
Немає коментарів:
Дописати коментар