X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fthreadraster.cpp;h=d3a67a913590ffe04c96d3d47fa46aab5b9ed432;hp=9853117a3755abaf40efc92ca3000b0e7bf43f9f;hb=8a7697ce57b56cdc43698cd1241ad98d49f9b5ac;hpb=e98a8a9d72a7b919debbbc9d1b0f237fe71c0fb3 diff --git a/src/threadraster.cpp b/src/threadraster.cpp index 9853117..d3a67a9 100644 --- a/src/threadraster.cpp +++ b/src/threadraster.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2001 Kevin Rosenberg ** -** $Id: threadraster.cpp,v 1.7 2001/03/04 04:30:45 kevin Exp $ +** $Id$ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -57,8 +57,8 @@ ///////////////////////////////////////////////////////////////////// RasterizerSupervisorThread::RasterizerSupervisorThread (PhantomFileView* pProjView, int iNX, int iNY, - int iNSample, double dViewRatio, const char* const pszLabel) -: SupervisorThread(), m_pPhantomView(pProjView), m_iNX(iNX), m_iNY(iNY), m_iNSample(iNSample), m_dViewRatio(dViewRatio), m_strLabel(pszLabel) + int iNSample, double dViewRatio, const char* const pszLabel) + : SupervisorThread(), m_pPhantomView(pProjView), m_iNX(iNX), m_iNY(iNY), m_iNSample(iNSample), m_dViewRatio(dViewRatio), m_strLabel(pszLabel) { } @@ -66,12 +66,13 @@ wxThread::ExitCode RasterizerSupervisorThread::Entry() { RasterizerSupervisor rasterSupervisor (this, m_pPhantomView, m_iNX, m_iNY, m_iNSample, m_dViewRatio, m_strLabel.c_str()); - + rasterSupervisor.start(); - while (! rasterSupervisor.isDone() && ! rasterSupervisor.fail()) { + + while (! rasterSupervisor.workersDone() && ! rasterSupervisor.fail() && ! rasterSupervisor.cancelled()) { Sleep(100); - Yield(); } + if (rasterSupervisor.fail()) { wxString msg ("Error starting Rasterizer supervisor: "); @@ -81,13 +82,12 @@ RasterizerSupervisorThread::Entry() eventLog.SetString( msg ); wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event } - - while (! rasterSupervisor.workersDeleted()) { - Sleep(50); - rasterSupervisor.ProcessPendingEvents(); - } - - return reinterpret_cast(0); + + if (! rasterSupervisor.cancelled()) + rasterSupervisor.onDone(); + rasterSupervisor.deleteWorkers(); + + return static_cast(0); } void @@ -103,18 +103,15 @@ RasterizerSupervisorThread::OnExit() ///////////////////////////////////////////////////////////////////// RasterizerSupervisor::RasterizerSupervisor (SupervisorThread* pThread, PhantomFileView* pPhantomView, int iNX, int iNY, - int iNSample, double dViewRatio, const char* const pszLabel) - : BackgroundSupervisor (pThread, pPhantomView->GetFrame(), pPhantomView->GetDocument(), "Rasterizing", iNX), - m_pPhantomView(pPhantomView), m_pPhantomDoc(pPhantomView->GetDocument()), - m_iNX(iNX), m_iNY(iNY), m_iNSample(iNSample), m_dViewRatio(dViewRatio), m_pszLabel(pszLabel) + int iNSample, double dViewRatio, const char* const pszLabel) + : BackgroundSupervisor (pThread, pPhantomView->GetFrame(), pPhantomView->GetDocument(), "Rasterizing", iNX), + m_pPhantomView(pPhantomView), m_pPhantomDoc(pPhantomView->GetDocument()), + m_iNX(iNX), m_iNY(iNY), m_iNSample(iNSample), m_dViewRatio(dViewRatio), m_pszLabel(pszLabel) { m_vecpChildImageFiles.reserve (getNumWorkers()); for (int iThread = 0; iThread < getNumWorkers(); iThread++) { m_vecpChildImageFiles[iThread] = new ImageFile; } - - - } RasterizerSupervisor::~RasterizerSupervisor() @@ -126,11 +123,11 @@ RasterizerSupervisor::~RasterizerSupervisor() BackgroundWorkerThread* RasterizerSupervisor::createWorker (int iThread, int iStartUnit, int iNumUnits) { - RasterizerWorker* pThread = new RasterizerWorker (this, iThread, iStartUnit, iNumUnits); - m_vecpChildImageFiles[iThread]->setArraySize (iNumUnits, m_iNY); - pThread->SetParameters (m_pPhantomView, m_vecpChildImageFiles[iThread], m_iNX, m_iNY, m_iNSample, m_dViewRatio); - - return pThread; + RasterizerWorker* pThread = new RasterizerWorker (this, iThread, iStartUnit, iNumUnits); + m_vecpChildImageFiles[iThread]->setArraySize (iNumUnits, m_iNY); + pThread->SetParameters (m_pPhantomView, m_vecpChildImageFiles[iThread], m_iNX, m_iNY, m_iNSample, m_dViewRatio); + + return pThread; } void @@ -138,16 +135,16 @@ RasterizerSupervisor::onDone() { wxCriticalSection doneSection; wxCriticalSectionLocker critsect (doneSection); - + ImageFile* pImageFile = getImageFile(); pImageFile->labelAdd (m_pszLabel, getTimerEnd()); - + wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT ); wxString msg (m_pszLabel); msg += "\n"; eventLog.SetString( msg ); wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event - + wxCommandEvent newImageEvent (wxEVT_COMMAND_MENU_SELECTED, NEW_IMAGEFILE_EVENT); newImageEvent.SetClientData (pImageFile); wxPostEvent (theApp->getMainFrame(), newImageEvent); @@ -160,9 +157,9 @@ ImageFile* RasterizerSupervisor::getImageFile() { ImageFile* pImageFile = new ImageFile (m_iNX, m_iNY); - + size_t iColSize = sizeof(ImageFileValue) * m_iNY; - + ImageFileArray globalArray = pImageFile->getArray(); int iGlobalCol = 0; for (int iw = 0; iw < getNumWorkers(); iw++) { @@ -210,18 +207,16 @@ RasterizerWorker::Entry () #endif break; } - rPhantom.convertToImagefile (*m_pImageFile, m_iNX, m_dViewRatio, m_iNSample, Trace::TRACE_NONE, - iUnit + m_iStartUnit, 1, iUnit); - wxPostEvent (m_pSupervisor, eventProgress); + rPhantom.convertToImagefile (*m_pImageFile, m_iNX, m_dViewRatio, m_iNSample, Trace::TRACE_NONE, iUnit + m_iStartUnit, 1, iUnit); + m_pSupervisor->onWorkerUnitTick(); } - wxCommandEvent eventDone (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_WORKER_THREAD_DONE); - eventDone.SetInt (m_iThread); // Send back thread# that has finished - wxPostEvent (m_pSupervisor, eventDone); - + + m_pSupervisor->onWorkerDone (m_iThread); + while (! TestDestroy()) Sleep(100); - - return reinterpret_cast(0); + + return static_cast(0); } void