michael@0: // Windows/Thread.h michael@0: michael@0: #ifndef __WINDOWS_THREAD_H michael@0: #define __WINDOWS_THREAD_H michael@0: michael@0: #include "Handle.h" michael@0: #include "Defs.h" michael@0: michael@0: namespace NWindows { michael@0: michael@0: class CThread: public CHandle michael@0: { michael@0: bool IsOpen() const { return _handle != 0; } michael@0: public: michael@0: bool Create(LPSECURITY_ATTRIBUTES threadAttributes, michael@0: SIZE_T stackSize, LPTHREAD_START_ROUTINE startAddress, michael@0: LPVOID parameter, DWORD creationFlags, LPDWORD threadId) michael@0: { michael@0: _handle = ::CreateThread(threadAttributes, stackSize, startAddress, michael@0: parameter, creationFlags, threadId); michael@0: return (_handle != NULL); michael@0: } michael@0: bool Create(LPTHREAD_START_ROUTINE startAddress, LPVOID parameter) michael@0: { michael@0: DWORD threadId; michael@0: return Create(NULL, 0, startAddress, parameter, 0, &threadId); michael@0: } michael@0: michael@0: DWORD Resume() michael@0: { return ::ResumeThread(_handle); } michael@0: DWORD Suspend() michael@0: { return ::SuspendThread(_handle); } michael@0: bool Terminate(DWORD exitCode) michael@0: { return BOOLToBool(::TerminateThread(_handle, exitCode)); } michael@0: michael@0: int GetPriority() michael@0: { return ::GetThreadPriority(_handle); } michael@0: bool SetPriority(int priority) michael@0: { return BOOLToBool(::SetThreadPriority(_handle, priority)); } michael@0: michael@0: bool Wait() michael@0: { michael@0: if (!IsOpen()) michael@0: return true; michael@0: return (::WaitForSingleObject(_handle, INFINITE) == WAIT_OBJECT_0); michael@0: } michael@0: michael@0: }; michael@0: michael@0: } michael@0: michael@0: #endif