2017-07-05 4 views
1

Ich habe eine Bibliothek, die einen Vektor von Zeichenfolgen als Argument akzeptiert & schiebt es auf einen Vektor des Vektors der Zeichenfolgen (2D-Vektor). Ich habe eine Bedingung, dass "von der ersten Zeile an den 2D-Vektor geschoben wird, sollte der Timer & für jede" X "-te Millisekunde starten Ich möchte eine spezielle Zeichenfolge" FLAG_BORDER "am Ende des Vektors der Zeichenfolge anhängen dass ich als Argument zur Bibliothek erhalten.Verfolgen Sie den Timer wiederholt in C++

BIBLIOTHEK CODE

using namespace std; 
vector<vector<sring>> vecOfVecStrs; 
MyLibraryFunction(vector<string> vecstr) 
{ 
    if(TimerLimitNOTHit()) // THIS FUNCTION TimerLimitNOTHit() checks if the "X" 
          // th milisecond is reached or not. 
    { 
      vecOfVecStrs.push_back(vecstr); // If "X"th ms time poeriod is NOT 
              // yet reached 
    } 
    else 
    { 
     vecstr.push_back("FLAG_BORDER"); 
     vecOfVecStrs.push_back(vecstr); 
    } 

ANWENDUNG Coderuf Library-Funktion ::

int main() 
{ 
    do_something(); 
    vector<string> vecStr; 
    while(vecStr = Get_VecTor_of_strings()) 
    { 
     MyLibraryFunction(vecStr); 
    } 

Wie implementiere ich die Funktion TimerLimitNOTHit() hier welche sollte verfolgen den Timer "X" milisec über Funktionsaufrufe zu "MyLibraryFunction()" in C++?

BEARBEITET: SEIFE WIE GEFUNDEN EINE ANTWORT. wird es funktionieren ?

int timeX = 30; //s 
bool keepTrack = false; 
int ci = 0; 
std::vector<int> timeArray; 
std::mutex m; 

bool keepTracking() 
{ 
    std::unique_lock<std::mutex> lock(m); 
    return keepTrack; 
} 

void GlobalTimer() 
{ 
    while (keepTracking()) 
    { 
     std::this_thread::sleep_for(std::chrono::seconds(timeX)); 
     timeArray[ci] = 1; 
    } 
} 



std::thread t1(GlobalTimer); 
+0

Bitte den Code einrücken. –

Antwort

1

Hier einige Anregungen, wo die Funktion TimerLimitNOTHit gibt true zurück, wenn mehr als X ms vergangen ist, seit es zuletzt true zurückgegeben.

int X = ... // #0 

bool TimerLimitNOTHit() 
{ 
    static auto start = std::chrono::steady_clock::now(); // #1 
    auto now = std::chrono::steady_clock::now(); 
    if (now - start > std::chrono::milliseconds(X)) 
    { 
     start = now // #2 
     return true; 
    } 
    return false 
} 

#0 Definition der zeitliche Abstand zwischen zwei Anrufen zu TimerLimitNOTHit, die true zurück.

#1 Die Initialisierung hängt von Ihrer Anwendungslogik ab. In diesem Beispiel gibt die Funktion beim ersten Aufruf nicht den Wert true zurück, dies kann geändert werden, indem start auf Null initialisiert wird.

#2 Startwert für die nächste Iteration, wiederum hängt dies von Ihrer Anwendungslogik ab. Wenn Sie einen konstanteren Wert wünschen, könnten Sie eine Modulo-Arithmetik durchführen.

Lassen Sie mich wissen, wenn dies nicht das ist, was Sie gesucht haben.

Haftungsausschluss

Ich weiß wirklich nicht wie die Verwendung von static Variablen, aber ohne einen „Status“ Parameter an die Funktion, die ich sehe nicht, wie es vermieden werden kann. Darüber hinaus fällt die Verwendung der globalen Variablen X auch nicht zu meiner Einschätzung. Die Variable X könnte in eine Template-Variable geändert werden, dies zeigt die Absicht besser und macht es zu einer Kompilierzeitkonstante.