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