Thread.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:5k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * HandVu - a library for computer vision-based hand gesture
  3.   * recognition.
  4.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu
  5.   *
  6.   * This program is free software; you can redistribute it and/or
  7.   * modify it under the terms of the GNU General Public License
  8.   * as published by the Free Software Foundation; either version 2
  9.   * of the License, or (at your option) any later version.
  10.   *
  11.   * This program is distributed in the hope that it will be useful,
  12.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.   * GNU General Public License for more details.
  15.   *
  16.   * You should have received a copy of the GNU General Public License
  17.   * along with this program; if not, write to the Free Software
  18.   * Foundation, Inc., 59 Temple Place - Suite 330, 
  19.   * Boston, MA  02111-1307, USA.
  20.   *
  21.   * $Id: Thread.cpp,v 1.4 2006/01/03 19:36:42 matz Exp $
  22. **/
  23. // Thread.cpp: wrapper around Afx and pthread
  24. //
  25. #include "Common.h"
  26. #include "Thread.h"
  27. #include "Exceptions.h"
  28. #if defined(WIN32)
  29. Thread::Thread(void* (*fun)(void*), void* arg)
  30. {
  31.   m_fun = fun;
  32.   m_arg = arg;
  33.   m_mutex = CreateMutex (NULL, FALSE, NULL);
  34.   if (m_mutex==NULL) throw HVException("can not initialize WIN32 mutex");
  35. }
  36. Thread::~Thread()
  37. {
  38. }
  39. /*
  40. UINT AfxThreadFunConversion(LPVOID pParam)
  41. {
  42.   void** vp = (void**) pParam;
  43.   void* (*fun)(void*) = (void* (*)(void*))vp[0];
  44.   void* arg = vp[1];
  45.   if (fun==NULL || arg==NULL) {
  46.     return 1;   // if arguments are not valid
  47.   }
  48.   fun(arg);
  49.     
  50.   return 0;   // thread completed successfully
  51. }
  52. */
  53. void Thread::Start()
  54. {
  55.   m_thread = _beginthread((void (*)(void*))m_fun, 0, m_arg);
  56.   if (m_thread == -1L) throw HVException("can not start WIN32 Thread");
  57. //  _endthreadex( 0 ); in m_fun-wrapper??
  58.  // void* vp[2];
  59.  // vp[0] = (void*) m_fun;
  60.  // vp[1] = m_arg;
  61. //m_pThread = AfxBeginThread(AfxThreadFunConversion, vp);
  62.  // if (m_pThread==NULL) throw HVException("can not start Afx Thread");
  63. }
  64. void Thread::Stop()
  65. {
  66.   this->~Thread();
  67.   //BOOL bDeleteFromMemory = TRUE;
  68.   //AfxEndThread(0, bDeleteFromMemory);
  69. }
  70. void Thread::Join()
  71. {
  72.   DWORD result = WaitForSingleObject( m_mutex, INFINITE );
  73.   if (result == WAIT_FAILED) throw HVException("can not join WIN32 thread");
  74. }
  75. // automatically releases all held locks
  76. void Thread::Suspend()
  77. {
  78.   DWORD result = WaitForSingleObject( m_mutex, INFINITE );
  79.   if (result == WAIT_FAILED) throw HVException("can not suspend WIN32 thread");
  80.  //DWORD result = ::SuspendThread(GetCurrentThread());
  81.   //if (result == 0xFFFFFFFF) throw HVException("can not suspend Afx Thread");
  82. }
  83. void Thread::Resume()
  84. {
  85.   BOOL success = ReleaseMutex(m_mutex);
  86.   if (!success) throw HVException("can not resume WIN32 thread");
  87.   //DWORD result = m_pThread->ResumeThread(); 
  88.   //if (result == 0xFFFFFFFF) throw HVException("can not resume Afx Thread");
  89. }
  90. void Thread::Lock()
  91. {
  92.   DWORD result = WaitForSingleObject( m_mutex, INFINITE );
  93.   if (result == WAIT_FAILED) throw HVException("can not lock Afx Lock");
  94. }
  95. void Thread::Unlock()
  96. {
  97.   BOOL success = ReleaseMutex(m_mutex);
  98.   if (!success) throw HVException("can not unlock WIN32 Lock");
  99. }
  100. #else //WIN32
  101. // now for Linux:
  102. Thread::Thread(void* (*fun)(void*), void* arg)
  103. {
  104.   m_fun = fun;
  105.   m_arg = arg;
  106.   int err;
  107.   err = pthread_cond_init(&m_cond, NULL);
  108.   if (err) throw HVException("can not initialize pthread conditional variable"); 
  109.   err = pthread_mutex_init(&m_mutex, NULL);
  110.   if (err) throw HVException("can not initialize pthread mutex");
  111. }
  112. Thread::~Thread()
  113. {
  114.   int err;
  115.   err = pthread_cond_destroy(&m_cond);
  116.   if (err) throw HVException("can not destroy conditional variable"); 
  117.   err = pthread_mutex_destroy(&m_mutex);
  118.   if (err) throw HVException("can not destroy mutex");
  119. }
  120. void Thread::Start()
  121. {
  122.   int err = pthread_create(&m_threadID, NULL, m_fun, m_arg);
  123.   if (err) throw HVException("can not start pthread");
  124. }
  125. void Thread::Stop()
  126. {
  127.   this->~Thread();
  128.   pthread_exit(NULL);
  129. }
  130. void Thread::Join()
  131. {
  132.   int err = pthread_join(m_threadID, NULL);
  133.   if (err) throw HVException("can not join pthread");
  134. }
  135. // automatically releases all held locks
  136. void Thread::Suspend()
  137. {
  138.   ASSERT(mutex locked);
  139.   int err = pthread_cond_wait(&m_cond, &m_mutex);
  140.   if (err) throw HVException("can not wait on pthread conditional");
  141. }
  142. void Thread::Resume()
  143. {
  144.   //signal conditional variable;
  145.   int err = pthread_cond_signal(&m_cond);
  146.   if (err) throw HVException("can not signal pthread conditional");
  147. }
  148. void Thread::Lock()
  149. {
  150.   int err = pthread_mutex_lock(&m_mutex);
  151.   if (err) throw HVException("can not lock pthread mutex");
  152. }
  153. void Thread::Unlock()
  154. {
  155.   int err = pthread_mutex_unlock(&m_mutex);
  156.   if (err) throw HVException("can not unlock pthread mutex");
  157. }
  158. #endif //WIN32