///////////////////////////////////////////////////////////////////////////// // Name: capturethread.cpp // Purpose: // Author: Cesar Mauri Loba (cesar at crea-si dot com) // Modified by: // Created: // Copyright: (C) 2008 Cesar Mauri Loba - CREA Software Systems // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ #pragma implementation #pragma interface #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif //precompiled headers #include #include "capturethread.h" #include "crvcamera.h" #include "camwindow.h" // Constructor CCaptureThread::CCaptureThread (CCamera *pCamera, CCamWindow *pCamWindow, CProcessImage *pProcessImage, wxThreadKind kind) : wxThread (kind) { assert (pCamera!= NULL); m_pCamera= pCamera; m_pCamWindow= pCamWindow; m_pProcessImage= pProcessImage; m_Life = true; } // Destructor CCaptureThread::~CCaptureThread () { } wxThreadError CCaptureThread::Create(unsigned int stackSize) { if (m_pCamera== NULL) return wxTHREAD_NO_RESOURCE; //if (!m_pCamera->Open()) return wxTHREAD_NO_RESOURCE; return wxThread::Create (stackSize); } wxThread::ExitCode CCaptureThread::Entry( ) { // Camera shold be opened inside calling thread if (!m_pCamera->Open()) { // This code never should be reached, but it may happen: there is a race condition between // testing camera availabiliy and effectively using it. wxMessageDialog errorMsg (NULL, _("Camera not detected. Aborting"), _("eViacam error"), wxOK | wxICON_ERROR); errorMsg.ShowModal(); exit (0); } // Start thread main loop while (m_Life) { if (TestDestroy()) break; IplImage* pImg= m_pCamera->QueryFrame(); if (pImg== NULL) wxMilliSleep(20); // If no result wait some time to avoid consuming all CPU else { if (m_pProcessImage) m_pProcessImage->ProcessImage (pImg); if (m_pCamWindow) m_pCamWindow->DrawCam (pImg); } } m_pCamera->Close(); return NULL; }