|
1
|
1 #pragma once
|
|
|
2
|
|
|
3 inline static t_size GetOptimalWorkerThreadCount() throw() {
|
|
|
4 return pfc::getOptimalWorkerThreadCount();
|
|
|
5 }
|
|
|
6
|
|
|
7 //! IMPORTANT: all classes derived from CVerySimpleThread must call WaitTillThreadDone() in their destructor, to avoid object destruction during a virtual function call!
|
|
|
8 class CVerySimpleThread : private pfc::thread {
|
|
|
9 public:
|
|
|
10 #ifdef _WIN32
|
|
|
11 void StartThread(int winPriority) {
|
|
|
12 StartThread(pfc::thread::argWinPriority(winPriority));
|
|
|
13 }
|
|
|
14 #endif
|
|
|
15 void StartThread( pfc::thread::arg_t const & arg = pfc::thread::argCurrentThread() ) {
|
|
|
16 pfc::thread::start( arg );
|
|
|
17 }
|
|
|
18
|
|
|
19 bool IsThreadActive() const {
|
|
|
20 return this->pfc::thread::isActive();
|
|
|
21 }
|
|
|
22 void WaitTillThreadDone() {
|
|
|
23 this->pfc::thread::waitTillDone();
|
|
|
24 }
|
|
|
25 protected:
|
|
|
26 CVerySimpleThread() {}
|
|
|
27 virtual void ThreadProc() = 0;
|
|
|
28 private:
|
|
|
29
|
|
|
30 void threadProc() {
|
|
|
31 this->ThreadProc();
|
|
|
32 }
|
|
|
33
|
|
|
34 PFC_CLASS_NOT_COPYABLE_EX(CVerySimpleThread)
|
|
|
35 };
|
|
|
36
|
|
|
37 //! IMPORTANT: all classes derived from CSimpleThread must call AbortThread()/WaitTillThreadDone() in their destructors, to avoid object destruction during a virtual function call!
|
|
|
38 class CSimpleThread : private completion_notify_receiver, private pfc::thread {
|
|
|
39 public:
|
|
|
40 #ifdef _WIN32
|
|
|
41 void StartThread(int winPriority) {
|
|
|
42 StartThread(pfc::thread::argWinPriority(winPriority));
|
|
|
43 }
|
|
|
44 #endif
|
|
|
45 void StartThread(pfc::thread::arg_t const & arg = pfc::thread::argCurrentThread() ) {
|
|
|
46 AbortThread();
|
|
|
47 m_abort.reset();
|
|
|
48 m_ownNotify = create_task(0);
|
|
|
49 this->pfc::thread::start( arg );
|
|
|
50 }
|
|
|
51 void AbortThread() {
|
|
|
52 m_abort.abort();
|
|
|
53 CloseThread();
|
|
|
54 }
|
|
|
55 bool IsThreadActive() const {
|
|
|
56 return this->pfc::thread::isActive();
|
|
|
57 }
|
|
|
58 void WaitTillThreadDone() {
|
|
|
59 CloseThread();
|
|
|
60 }
|
|
|
61 protected:
|
|
|
62 CSimpleThread() {}
|
|
|
63 ~CSimpleThread() {AbortThread();}
|
|
|
64
|
|
|
65 virtual unsigned ThreadProc(abort_callback & p_abort) = 0;
|
|
|
66 //! Called when the thread has completed normally, with p_code equal to ThreadProc retval. Not called when AbortThread() or WaitTillThreadDone() was used to abort the thread / wait for the thread to finish.
|
|
|
67 virtual void ThreadDone(unsigned p_code) {};
|
|
|
68 private:
|
|
|
69 void CloseThread() {
|
|
|
70 this->pfc::thread::waitTillDone();
|
|
|
71 orphan_all_tasks();
|
|
|
72 }
|
|
|
73
|
|
|
74 void on_task_completion(unsigned p_id,unsigned p_status) {
|
|
|
75 if (IsThreadActive()) {
|
|
|
76 CloseThread();
|
|
|
77 ThreadDone(p_status);
|
|
|
78 }
|
|
|
79 }
|
|
|
80 void threadProc() {
|
|
|
81 unsigned code = ~0;
|
|
|
82 try {
|
|
|
83 code = ThreadProc(m_abort);
|
|
|
84 } catch(...) {}
|
|
|
85 if (!m_abort.is_aborting()) m_ownNotify->on_completion_async(code);
|
|
|
86 }
|
|
|
87 abort_callback_impl m_abort;
|
|
|
88 completion_notify_ptr m_ownNotify;
|
|
|
89
|
|
|
90 PFC_CLASS_NOT_COPYABLE_EX(CSimpleThread);
|
|
|
91 };
|
|
|
92
|