Add worker thread
[trackerpp.git] / src / Engine.cpp
index 74659a0..4f67103 100644 (file)
@@ -1,17 +1,20 @@
 #include <mutex>
 #include <thread>
+#include <condition_variable>
 #include "Engine.h"
 #include "Logger.h"
 #include "PredictorWrapper.h"
 
 using namespace suanzi;
+using namespace std;
 
 static const std::string TAG = "Engine";
-
 static std::mutex g_mutex;
 static EngineWPtr g_instance;
 
+typedef std::shared_ptr<std::vector<Person>> PersonsInfoPtr;
 
+// class Engine
 EnginePtr Engine::create()
 {
     LOG_DEBUG(TAG, "create");
@@ -28,7 +31,6 @@ EnginePtr Engine::create()
 Engine::Engine()
 {
     detector = std::make_shared<Detector>();
-    multiTracker = std::make_shared<MultiTracker>();
 }
 
 Engine::~Engine()
@@ -66,6 +68,7 @@ void Engine::run()
 void Engine::start()
 {
     LOG_DEBUG(TAG, "start");
+    multiTracker = std::make_shared<MultiTracker>(g_instance);
     if (!reader){
         LOG_ERROR(TAG, "reader is null. exit");
         return;
@@ -78,3 +81,58 @@ void Engine::addObserver(EngineObserver *observer)
 {
     observer_list.insert(observer);
 }
+
+
+// WorkItem class for event thread
+class PersonInEventWorkItem : public WorkItem
+{
+public:
+    PersonInEventWorkItem(std::set<EngineObserver*> obs, PersonsInfoPtr info) : obs(obs), info(info){
+    }
+    ~PersonInEventWorkItem(){}
+    void run (){
+        for (auto o : obs){
+            o->onPersonsIn(*(info.get()));
+        }
+    }
+private:
+    std::set<EngineObserver*> obs;
+    PersonsInfoPtr info;
+};
+
+class PersonOutEventWorkItem : public WorkItem
+{
+public:
+    PersonOutEventWorkItem(std::set<EngineObserver*> obs, PersonsInfoPtr info) : obs(obs), info(info){
+    }
+    ~PersonOutEventWorkItem(){}
+    void run (){
+        for (auto o : obs){
+            o->onPersonsIn(*(info.get()));
+        }
+    }
+private:
+    std::set<EngineObserver*> obs;
+    PersonsInfoPtr info;
+};
+
+void Engine::onPersonsOut(const std::vector<Person>& p)
+{
+    PersonsInfoPtr pp = std::make_shared<std::vector<Person>>(p);
+    eventThread.enqueue(new PersonOutEventWorkItem(this->observer_list, pp));
+}
+
+void Engine::onPersonsIn(const std::vector<Person>& p)
+{
+    PersonsInfoPtr pp = std::make_shared<std::vector<Person>>(p);
+    eventThread.enqueue(new PersonInEventWorkItem(this->observer_list, pp));
+}
+
+void Engine::onStatusChanged()
+{
+    Person pm, p2;
+    std::vector<Person> ps;
+    ps.push_back(pm);
+    ps.push_back(p2);
+    onPersonsOut(ps);
+}