00001 00002 // 00003 // SFML - Simple and Fast Multimedia Library 00004 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) 00005 // 00006 // This software is provided 'as-is', without any express or implied warranty. 00007 // In no event will the authors be held liable for any damages arising from the use of this software. 00008 // 00009 // Permission is granted to anyone to use this software for any purpose, 00010 // including commercial applications, and to alter it and redistribute it freely, 00011 // subject to the following restrictions: 00012 // 00013 // 1. The origin of this software must not be misrepresented; 00014 // you must not claim that you wrote the original software. 00015 // If you use this software in a product, an acknowledgment 00016 // in the product documentation would be appreciated but is not required. 00017 // 00018 // 2. Altered source versions must be plainly marked as such, 00019 // and must not be misrepresented as being the original software. 00020 // 00021 // 3. This notice may not be removed or altered from any source distribution. 00022 // 00024 00026 // Headers 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 // Wait for the thread to finish before destroying the instance 00065 if (myHandle) 00066 Wait(); 00067 } 00068 00069 00073 void Thread::Launch() 00074 { 00075 // Create the thread 00076 myHandle = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, &Thread::ThreadFunc, this, 0, NULL)); 00077 00078 // Error ? 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 // Wait for the thread to finish, no timeout 00092 WaitForSingleObject(myHandle, INFINITE); 00093 00094 // Don't forget to close the thread handle (__endthreadex doesn't do it) 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 // The Thread instance is stored in the user data 00133 Thread* ThreadInstance = reinterpret_cast<Thread*>(UserData); 00134 00135 // Forward to the instance 00136 ThreadInstance->Run(); 00137 00138 // Optional, but it is cleaner 00139 _endthreadex(0); 00140 00141 return 0; 00142 } 00143 00144 } // namespace sf
:: Copyright © 2007-2008 Laurent Gomila, all rights reserved :: Documentation generated by doxygen 1.5.2 ::