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->ExitEvent) 14 return 0; 15 t->Execute(); 16 t->FinishedEvent.Set(); 17 } 18} 19 20WRes CVirtThread::Create() 21{ 22 RINOK(StartEvent.CreateIfNotCreated()); 23 RINOK(FinishedEvent.CreateIfNotCreated()); 24 StartEvent.Reset(); 25 FinishedEvent.Reset(); 26 ExitEvent = false; 27 if (Thread.IsCreated()) 28 return S_OK; 29 return Thread.Create(CoderThread, this); 30} 31 32void CVirtThread::Start() 33{ 34 ExitEvent = false; 35 StartEvent.Set(); 36} 37 38CVirtThread::~CVirtThread() 39{ 40 ExitEvent = true; 41 if (StartEvent.IsCreated()) 42 StartEvent.Set(); 43 if (Thread.IsCreated()) 44 Thread.Wait(); 45} 46 47