1// VirtThread.cpp 2 3#include "StdAfx.h" 4 5#include "VirtThread.h" 6 7static THREAD_FUNC_DECL CoderThread(void *p) 8{ 9 for (;;) 10 { 11 CVirtThread *t = (CVirtThread *)p; 12 t->StartEvent.Lock(); 13 if (t->Exit) 14 return THREAD_FUNC_RET_ZERO; 15 t->Execute(); 16 t->FinishedEvent.Set(); 17 } 18} 19 20WRes CVirtThread::Create() 21{ 22 RINOK_WRes(StartEvent.CreateIfNotCreated_Reset()) 23 RINOK_WRes(FinishedEvent.CreateIfNotCreated_Reset()) 24 // StartEvent.Reset(); 25 // FinishedEvent.Reset(); 26 Exit = false; 27 if (Thread.IsCreated()) 28 return S_OK; 29 return Thread.Create(CoderThread, this); 30} 31 32WRes CVirtThread::Start() 33{ 34 Exit = false; 35 return StartEvent.Set(); 36} 37 38void CVirtThread::WaitThreadFinish() 39{ 40 Exit = true; 41 if (StartEvent.IsCreated()) 42 StartEvent.Set(); 43 if (Thread.IsCreated()) 44 { 45 Thread.Wait_Close(); 46 } 47} 48