topical media & game development
lib-of-vs-addons-ofxThread-src-ofxThread.cpp / cpp
include <ofxThread.h>
//-------------------------------------------------
ofxThread::ofxThread(){
threadRunning = false;
#ifdef TARGET_WIN32
InitializeCriticalSection(&critSec);
#else
pthread_mutex_init(&myMutex, NULL);
#endif
}
//-------------------------------------------------
ofxThread::~ofxThread(){
#ifndef TARGET_WIN32
pthread_mutex_destroy(&myMutex);
#endif
stopThread();
}
//-------------------------------------------------
bool ofxThread::isThreadRunning(){
//should be thread safe - no writing of vars here
return threadRunning;
}
//-------------------------------------------------
void ofxThread::startThread(bool _blocking, bool _verbose){
if( threadRunning ){
if(verbose)printf("ofxThread: thread already running\n");
return;
}
//have to put this here because the thread can be running
//before the call to create it returns
threadRunning = true;
#ifdef TARGET_WIN32
//InitializeCriticalSection(&critSec);
myThread = (HANDLE)_beginthreadex(NULL, 0, this->thread, (void *)this, 0, NULL);
#else
//pthread_mutex_init(&myMutex, NULL);
pthread_create(&myThread, NULL, thread, (void *)this);
#endif
blocking = _blocking;
verbose = _verbose;
}
//-------------------------------------------------
//returns false if it can't lock
bool ofxThread::lock(){
#ifdef TARGET_WIN32
if(blocking)EnterCriticalSection(&critSec);
else {
if(!TryEnterCriticalSection(&critSec)){
if(verbose)printf("ofxThread: mutext is busy \n");
return false;
}
}
if(verbose)printf("ofxThread: we are in -- mutext is now locked \n");
#else
if(blocking){
if(verbose)printf("ofxThread: waiting till mutext is unlocked\n");
pthread_mutex_lock(&myMutex);
if(verbose)printf("ofxThread: we are in -- mutext is now locked \n");
}else{
int value = pthread_mutex_trylock(&myMutex);
if(value == 0){
if(verbose)printf("ofxThread: we are in -- mutext is now locked \n");
}
else{
if(verbose)printf("ofxThread: mutext is busy - already locked\n");
return false;
}
}
#endif
return true;
}
//-------------------------------------------------
bool ofxThread::unlock(){
#ifdef TARGET_WIN32
LeaveCriticalSection(&critSec);
#else
pthread_mutex_unlock(&myMutex);
#endif
if(verbose)printf("ofxThread: we are out -- mutext is now unlocked \n");
return true;
}
//-------------------------------------------------
void ofxThread::stopThread(){
if(threadRunning){
#ifdef TARGET_WIN32
CloseHandle(myThread);
#else
//pthread_mutex_destroy(&myMutex);
pthread_detach(myThread);
#endif
if(verbose)printf("ofxThread: thread stopped\n");
threadRunning = false;
}else{
if(verbose)printf("ofxThread: thread already stopped\n");
}
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.