Thread.cpp
00001 00002 // 00003 // SFML - Simple and Fast Multimedia Library 00004 // Copyright (C) 2007-2009 Laurent Gomila ([email protected]) 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 Wait(); 00066 } 00067 00068 00072 void Thread::Launch() 00073 { 00074 // Wait for the thread to finish, in case it was already running 00075 Wait(); 00076 00077 // Create the thread 00078 myHandle = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, &Thread::ThreadFunc, this, 0, NULL)); 00079 00080 // Error ? 00081 if (myHandle == NULL) 00082 std::cerr << "Failed to create thread" << std::endl; 00083 } 00084 00085 00089 void Thread::Wait() 00090 { 00091 if (myHandle) 00092 { 00093 // Wait for the thread to finish, no timeout 00094 WaitForSingleObject(myHandle, INFINITE); 00095 00096 // Don't forget to close the thread handle (__endthreadex doesn't do it) 00097 CloseHandle(myHandle); 00098 myHandle = NULL; 00099 } 00100 } 00101 00102 00109 void Thread::Terminate() 00110 { 00111 if (myHandle) 00112 { 00113 TerminateThread(myHandle, 0); 00114 myHandle = NULL; 00115 } 00116 } 00117 00118 00122 void Thread::Run() 00123 { 00124 if (myFunction) 00125 myFunction(myUserData); 00126 } 00127 00128 00132 unsigned int __stdcall Thread::ThreadFunc(void* UserData) 00133 { 00134 // The Thread instance is stored in the user data 00135 Thread* ThreadInstance = reinterpret_cast<Thread*>(UserData); 00136 00137 // Forward to the instance 00138 ThreadInstance->Run(); 00139 00140 // Optional, but it is cleaner 00141 _endthreadex(0); 00142 00143 return 0; 00144 } 00145 00146 } // namespace sf
:: Copyright © 2007-2008 Laurent Gomila, all rights reserved :: Documentation generated by doxygen 1.5.2 ::