--- /dev/null
+#include "../../include/threadwrapper/threadedexecutor.h"\r
+\r
+ThreadedExecutor::~ThreadedExecutor()\r
+{\r
+ for(std::vector<CancelableThread *>::iterator i=m_threads.begin(); i!=m_threads.end(); i++)\r
+ {\r
+ (*i)->Cancel();\r
+ (*i)->join();\r
+ delete (*i);\r
+ }\r
+}\r
+\r
+void ThreadedExecutor::Cancel()\r
+{\r
+ for(std::vector<CancelableThread *>::iterator i=m_threads.begin(); i!=m_threads.end(); i++)\r
+ {\r
+ if((*i)->isRunning())\r
+ {\r
+ (*i)->Cancel();\r
+ }\r
+ }\r
+}\r
+\r
+void ThreadedExecutor::CleanupCompleted()\r
+{\r
+ for(std::vector<CancelableThread *>::iterator i=m_threads.begin(); i!=m_threads.end(); )\r
+ {\r
+ if((*i)->isRunning()==false)\r
+ {\r
+ delete (*i);\r
+ i=m_threads.erase(i);\r
+ }\r
+ else\r
+ {\r
+ i++;\r
+ }\r
+ }\r
+}\r
+\r
+void ThreadedExecutor::Join()\r
+{\r
+ for(std::vector<CancelableThread *>::iterator i=m_threads.begin(); i!=m_threads.end(); i++)\r
+ {\r
+ (*i)->join();\r
+ }\r
+ CleanupCompleted();\r
+}\r
+\r
+void ThreadedExecutor::Start(CancelableRunnable *runnable)\r
+{\r
+ m_threads.push_back(new CancelableThread(runnable));\r
+ CleanupCompleted();\r
+}\r