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