VirtThread.cpp 750 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // VirtThread.cpp
  2. #include "StdAfx.h"
  3. #include "VirtThread.h"
  4. static THREAD_FUNC_DECL CoderThread(void *p)
  5. {
  6. for (;;)
  7. {
  8. CVirtThread *t = (CVirtThread *)p;
  9. t->StartEvent.Lock();
  10. if (t->ExitEvent)
  11. return 0;
  12. t->Execute();
  13. t->FinishedEvent.Set();
  14. }
  15. }
  16. HRes CVirtThread::Create()
  17. {
  18. RINOK(StartEvent.CreateIfNotCreated());
  19. RINOK(FinishedEvent.CreateIfNotCreated());
  20. StartEvent.Reset();
  21. FinishedEvent.Reset();
  22. ExitEvent = false;
  23. if (Thread.IsCreated())
  24. return S_OK;
  25. return Thread.Create(CoderThread, this);
  26. }
  27. void CVirtThread::Start()
  28. {
  29. ExitEvent = false;
  30. StartEvent.Set();
  31. }
  32. CVirtThread::~CVirtThread()
  33. {
  34. ExitEvent = true;
  35. if (StartEvent.IsCreated())
  36. StartEvent.Set();
  37. Thread.Wait();
  38. }