Zliczanie w wyznaczonym przedziale czasu

0

Witam,

Mam problem z wymyśleniem sposobu na coś takiego:

Pewna funkcja jest wywoływana w nieregularnych odstępach czasu (od kilku do kilkudziesięciu razy w ciągu minuty). Między innymi zwraca ona jakąś wartość liczbową, którą dodaje do tablicy X.
I teraz w tej tablicy X chcę mieć tylko wartości dodane w ciągu ostatnich 60 sekund. Wszystkie dodane wcześniej mają z niej zniknąć...

0

Rozwiązań jest dużo. Nie wiem czy to ma być C/C++ czy C#, jeżeli C to można zrobić strukturę i obok wartości zapisywać w niej sekundę :P
Można też pokombinować z timerami

0
au7h napisał(a):

Rozwiązań jest dużo. Nie wiem czy to ma być C/C++ czy C#, jeżeli C to można zrobić strukturę i obok wartości zapisywać w niej sekundę :P
Można też pokombinować z timerami

Dzięki za zainteresowanie i podpowiedź.
Aplikacja jest pisana w C++. Myślałem na timerami ale nie mam pojęcia jak ich użyć w tym konkretnym przypadku...

2

Taki pseudo-kod :P

static const clock_t begin = clock();
...
std::map<float, std::string> values = {};
...
jakas_funkcja(values);
//czekaj ileś tam sekund
jakas_funkcja(values);
//czekaj ileś tam sekund
jakas_funkcja(values);

//znajdz największą wartość float i odejmij od niej 60
//wyciągaj wartości z range max do max - 60
...
void jakas_funkcja(std::map<float, std::string> & values){ values.put(float (clock() - begin) / CLOCKS_PER_SEC, zmienna1); }

0

Dzięki za podpowiedź. Faktycznie dość proste to jest ;-)

0

Pokombinuję, poulepszam, dopracuję i będzie OK. Ważne, że jest się na czym wzorować ;-)

1
template<typename T, size_t maxAgeSeconds>
class LastValeesInPeriod {
public:
    using clock = std::chrono::steady_clock;
    using time_point = clock::time_point;

    void add(T &&x) {
         auto now = clock::now();
         data.emplace(now, std::forward<T>(x));
         trimData(now - std::chrono::seconds(maxAgeSeconds));
    }

private:
    void trimData(time_point t) {
         while(!data.empty() && data.front().first < t) {
              data.pop();
         }
    }
    std::queue<std::pair<time_point, T>> data;
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1