00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00026
00028 #include <SFML/System/Win32/Thread.hpp>
00029 #include <process.h>
00030 #include <iostream>
00031
00032
00033 namespace sf
00034 {
00038 Thread::Thread() :
00039 myHandle (NULL),
00040 myFunction(NULL),
00041 myUserData(NULL)
00042 {
00043
00044 }
00045
00046
00050 Thread::Thread(Thread::FuncType Function, void* UserData) :
00051 myHandle (NULL),
00052 myFunction(Function),
00053 myUserData(UserData)
00054 {
00055
00056 }
00057
00058
00062 Thread::~Thread()
00063 {
00064
00065 if (myHandle)
00066 Wait();
00067 }
00068
00069
00073 void Thread::Launch()
00074 {
00075
00076 myHandle = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, &Thread::ThreadFunc, this, 0, NULL));
00077
00078
00079 if (myHandle == NULL)
00080 std::cerr << "Failed to create thread" << std::endl;
00081 }
00082
00083
00087 void Thread::Wait()
00088 {
00089 if (myHandle)
00090 {
00091
00092 WaitForSingleObject(myHandle, INFINITE);
00093
00094
00095 CloseHandle(myHandle);
00096 myHandle = NULL;
00097 }
00098 }
00099
00100
00107 void Thread::Terminate()
00108 {
00109 if (myHandle)
00110 {
00111 TerminateThread(myHandle, 0);
00112 myHandle = NULL;
00113 }
00114 }
00115
00116
00120 void Thread::Run()
00121 {
00122 if (myFunction)
00123 myFunction(myUserData);
00124 }
00125
00126
00130 unsigned int __stdcall Thread::ThreadFunc(void* UserData)
00131 {
00132
00133 Thread* ThreadInstance = reinterpret_cast<Thread*>(UserData);
00134
00135
00136 ThreadInstance->Run();
00137
00138
00139 _endthreadex(0);
00140
00141 return 0;
00142 }
00143
00144 }