SFML logo
  • Main Page
  • Namespaces
  • Classes
  • Files
  • File List

Thread.cpp

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  ::