summaryrefslogtreecommitdiff
path: root/source/modules/asura-utils/threading/thread_impl_win32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/modules/asura-utils/threading/thread_impl_win32.cpp')
-rw-r--r--source/modules/asura-utils/threading/thread_impl_win32.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/source/modules/asura-utils/threading/thread_impl_win32.cpp b/source/modules/asura-utils/threading/thread_impl_win32.cpp
new file mode 100644
index 0000000..6871c2d
--- /dev/null
+++ b/source/modules/asura-utils/threading/thread_impl_win32.cpp
@@ -0,0 +1,76 @@
+#include "thread_impl_win32.h"
+#include "thread.h"
+
+#include <iostream>
+
+namespace AsuraEngine
+{
+ namespace Threading
+ {
+
+ static DWORD WINAPI _thread_win32_runner(LPVOID param)
+ {
+ Thread* thread = (Thread*)param;
+ thread->Process();
+ return 0;
+ }
+
+ ThreadImplWin32::ThreadImplWin32()
+ {
+ }
+
+ ThreadImplWin32::~ThreadImplWin32()
+ {
+ if (!mHandle) return;
+ ::CloseHandle(mHandle);
+ mHandle = 0;
+ }
+
+ bool ThreadImplWin32::Start(Thread* thread, uint32 stacksize/*=0*/)
+ {
+ assert(!IsRunning());
+ mHandle = ::CreateThread(
+ NULL
+ , stacksize
+ , _thread_win32_runner
+ , thread
+ , 0 /*е*/
+ , NULL);
+
+ return mHandle;
+ }
+
+ void ThreadImplWin32::Join()
+ {
+ // ̵߳ȴ̷߳
+ ::WaitForSingleObject(mHandle, INFINITE);
+ }
+
+ void ThreadImplWin32::Kill()
+ {
+ ::TerminateThread(mHandle, FALSE);
+ }
+
+ void ThreadImplWin32::Sleep(uint ms)
+ {
+ ::Sleep(ms);
+ }
+
+ bool ThreadImplWin32::IsRunning()
+ {
+ if (mHandle) {
+ DWORD exitCode = 0;
+ // https://blog.csdn.net/yuanmeng567/article/details/19485719
+ ::GetExitCodeThread(mHandle, &exitCode);
+ return exitCode == STILL_ACTIVE;
+ }
+ return false;
+ }
+
+ bool ThreadImplWin32::IsCurrent()
+ {
+ return mHandle == ::GetCurrentThread();
+ }
+
+ }
+} \ No newline at end of file