Wątek przeniesiony 2019-07-08 21:12 z przez Ktos.

Zliczanie w wyznaczonym przedziale czasu

Odpowiedz Nowy wątek
2019-07-08 19:06
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ąć...

edytowany 1x, ostatnio: Sokon, 2019-07-08 19:08

Pozostało 580 znaków

2019-07-08 19:13
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

Pozostało 580 znaków

2019-07-08 19:19
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...

Pozostało 580 znaków

2019-07-08 19:38

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); }

edytowany 3x, ostatnio: au7h, 2019-07-08 19:39

Pozostało 580 znaków

2019-07-08 19:47
0

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

da sie to na pewno lepiej zrobić, ale teraz to nie na moją głowę :P - au7h 2019-07-08 19:51

Pozostało 580 znaków

2019-07-08 19:55
0

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

Pozostało 580 znaków

2019-07-09 00:54
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;
};

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2019-07-09 00:54

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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