From 2a9ffa62102a896e21048c23d311fed5f8471e68 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期三, 17 六月 2020 13:56:35 +0800
Subject: [PATCH] time

---
 algorithm/IndirectAlg.c |   44 +++++++++++++++++++++++++++-----------------
 1 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/algorithm/IndirectAlg.c b/algorithm/IndirectAlg.c
index 45d95d8..69640eb 100644
--- a/algorithm/IndirectAlg.c
+++ b/algorithm/IndirectAlg.c
@@ -41,13 +41,16 @@
 
 IndirectAlg::IndirectAlg(const initializer_list<Point> & points, const time_t & _keepTime, const Vector2 & _direction): 
     keepTime(_keepTime), direction(_direction), mterminate(false) {
-    std::vector<Edge> edges;
-    initializer_list<Point>::iterator iter;
-    for(iter = points.begin(); iter < points.end(); iter++ ) {
-        edges.push_back({*iter, *(iter +1)});
+    if (points.size() > 0) {
+        std::vector<Edge> edges;
+        initializer_list<Point>::iterator iter;
+        for(iter = points.begin(); iter < points.end(); iter++ ) {
+            edges.push_back({*iter, *(iter +1)});
+        }
+        edges.push_back({*(points.end()), *(points.begin())});
+        frame = Figure(edges);
     }
-    edges.push_back({*(points.end()), *(points.begin())});
-    frame = Figure(edges);
+    
 
     mthread = std::thread(std::bind(&IndirectAlg::threadRoutine, this));
 
@@ -76,14 +79,16 @@
     map<string, Status *>::iterator iter; 
     Status *status = nullptr;
     while (!mterminate.load()) {
-       // err_msg(0, "===========thread==========run" );
-        std::this_thread::sleep_for(std::chrono::seconds(this->keepTime));
+        std::this_thread::sleep_for(std::chrono::seconds(this->keepTime * 2));
         //sleep(this->keepTime);
         for(iter = statusMap.begin(); iter != statusMap.end(); iter++) {
-            //cout<<iter->first<<' '<<iter->second<<endl; 
+          
             status = iter->second;
             if (status != nullptr) {
-                if(time_t(0) - status->lastTime > this->keepTime) {
+                // cout<< "iter " << iter->first <<' '<< iter->second <<  status->lastTime << endl; 
+               // printf("%ld, %ld, %ld\n", time(NULL), status->lastTime, (time(0) - status->lastTime));
+                if(difftime(time(NULL), status->lastTime) > this->keepTime*2) {
+                    std::cout << status->id << "鑴辩鐩戞帶鍖�, remove from map\n";
                     delete status;
                     statusMap.erase(iter);
                 }
@@ -136,16 +141,20 @@
         return false;
     }
 
-     
-    status->lastTime = record.timestamp;
-
     Vector2 currentDirection = getVecor2(status -> lastCoordinate, record.coordinate);
+    if(difftime(record.timestamp, status->lastTime) >= this->keepTime) {
+//printf("update lastCoordinate curtime=%ld, lastTime=%ld, diff=%f\n", record.timestamp, status->lastTime, difftime(record.timestamp, status->lastTime));
+        status->lastTime = record.timestamp;
+        status->lastCoordinate = record.coordinate;
+    }
+
     if (currentDirection.x == 0 && currentDirection.y == 0) {
         //娌″姩
         printRecord(3, record);
         return false;
     }
-    status -> lastCoordinate = record.coordinate;
+
+    //status -> lastCoordinate = record.coordinate;
     //閫嗚鍒ゆ柇 cos灏忎簬0鍗充袱涓悜閲忕殑澶硅澶т簬90搴�,琛ㄧず閫嗚浜�
     if(frame.contains(record.coordinate) && getVector2Angle(direction, currentDirection) <= 0) {
         if(status->firstInvalTime ==0) {
@@ -159,7 +168,7 @@
             status->lastInvalTime = record.timestamp;
 //printf("%鍚庣画鍙戠敓閫嗚鐨勬椂闂�=%ld\n", status->lastInvalTime);
             //閫嗚鏃堕棿瓒呰繃keeptime
-            if (status->lastInvalTime - status-> firstInvalTime >= keepTime) {
+            if (difftime(status->lastInvalTime, status->firstInvalTime) >= keepTime) {
                 status->firstValTime = status->lastValTime = 0;
                 printRecord(5, record);
                 return true;
@@ -170,12 +179,13 @@
     } else {
        
         if(status->firstValTime ==0) {
+            //璁板綍绗竴娆℃纭璧版椂闂�
             status->firstValTime = status->lastValTime = record.timestamp;
             printRecord(7, record);
         } else {
             status->lastValTime = record.timestamp;
-             //閫嗚鏃堕棿瓒呰繃keeptime
-            if (status->lastValTime - status-> firstValTime >= keepTime) {
+             //姝g‘琛岃蛋鏃堕棿瓒呰繃keeptime
+            if (difftime(status->lastValTime, status->firstValTime) >= keepTime) {
                 status->firstInvalTime = status->lastInvalTime = 0;
                 printRecord(8, record);
             } 

--
Gitblit v1.8.0