00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 #include <opc/common/thread.h> 00012 00013 #include <iostream> 00014 00015 namespace Common 00016 { 00017 00018 Thread::Thread(std::function<void()> f, ThreadObserver* observer) 00019 : Observer(observer) 00020 , Func(f) 00021 , Impl(Thread::ThreadProc, this) 00022 { 00023 } 00024 00025 Thread::~Thread() 00026 { 00027 try 00028 { 00029 Join(); 00030 } 00031 catch (std::exception&) 00032 { 00033 } 00034 } 00035 00036 void Thread::Join() 00037 { 00038 Impl.join(); 00039 } 00040 00041 void Thread::Run() 00042 { 00043 try 00044 { 00045 Func(); 00046 if (Observer) 00047 { 00048 Observer->OnSuccess(); 00049 } 00050 } 00051 catch (const std::exception& exc) 00052 { 00053 if (Observer) 00054 { 00055 Observer->OnError(exc); 00056 } 00057 } 00058 } 00059 00060 void Thread::ThreadProc(Thread* thread) 00061 { 00062 thread->Run(); 00063 } 00064 00065 } // namespace Common 00066