topical media & game development

talk show tell print

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.