• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wykonywanie polecenia co określony czas.

Object Storage Arubacloud
0 głosów
552 wizyt
pytanie zadane 12 listopada 2017 w C i C++ przez zkkf56 Dyskutant (8,710 p.)

Witam,

Mam pytanie, czy da radę w C++ zrobić coś takiego, by co np. 1 sekunde wykonywało się jakieś polecenie.

Ale nie chodzi mi o:

while(true)
{
kasa++;
Sleep("100")
}

 

1
komentarz 12 listopada 2017 przez Gynvael Coldwind Nałogowiec (27,530 p.)
Przydałoby się jakieś wytłumaczenie, dlaczego rozwiązanie tego typu Ci nie odpowiada, i jakiego typu rozwiązania szukasz.
komentarz 12 listopada 2017 przez niezalogowany
To co powiedział Gyn + to, że kod który podałeś nie wykonuje się co 1s, a 100ms ;)
2
komentarz 12 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

shead, nie wykonuje się nawet co 100ms. Nigdy wcześniej nie widziałem, żeby jakaś funkcja przyjmowała interwał czasowy w postaci tekstu laugh

komentarz 12 listopada 2017 przez zkkf56 Dyskutant (8,710 p.)
Chcę, aby co 1 sekundę dodawało się 1 do zmiennej
komentarz 12 listopada 2017 przez Gynvael Coldwind Nałogowiec (27,530 p.)
(w sumie wystarczy, że powtórzę swój komentarz ;)

Przydałoby się jakieś wytłumaczenie, dlaczego rozwiązanie tego typu Ci nie odpowiada, i jakiego typu rozwiązania szukasz.
komentarz 12 listopada 2017 przez niezalogowany
Hah, faktycznie tam jest string :p
komentarz 12 listopada 2017 przez zkkf56 Dyskutant (8,710 p.)
Chciałbym zrobić coś takiego jak jest np. w clickerach, że co 1 sekunde dodaje Ci się 1 punkt, a takie rozwiązanie mi nie pasuje, bo zastanawiam się, czy może jest jakieś inne fajniejsze.
komentarz 12 listopada 2017 przez Gynvael Coldwind Nałogowiec (27,530 p.)
Hmm, nie wiem co to są clickery.

Twoje rozwiązanie jest ogólnie dobre, poza tym, że korzysta z WinAPI (jeśli piszesz pod Windowsa to nie ma z tym problemu). Osobiście pewnie bym dorzucił jakiś warunek końca + ew. synchronizacje tej zmiennej jeśli działasz w wielu wątkach (a pewnie tak jest).

1 odpowiedź

0 głosów
odpowiedź 12 listopada 2017 przez mokrowski Mędrzec (155,460 p.)
wybrane 12 listopada 2017 przez zkkf56
 
Najlepsza

Można np. tak:

#include <iostream>
#include <thread>
#include <chrono>
#include <string>

void worker(const std::string& msg) {
        std::cout << "Uruchomienie funkcji z parametrem: " << msg << std::endl;
}

void incrementer(int& value) {
    ++value;
}

template<typename Function, typename... Args>
void cycle_run(std::chrono::seconds dur, Function func, Args&&... args) {
    using namespace std::chrono;

    system_clock::time_point next_run = system_clock::now()
        + dur;

    for(;;) {
        std::this_thread::sleep_until(next_run);
        func(std::forward<Args>(args)...);
        next_run += dur;
    }
}

int main() {
    // Jakaś zmienna do testu.
    int value = 0;
    // Komunikat co 1 sekundę.
    auto period = std::chrono::seconds(1);

    // Przykład 1 i 2. Aby sprawdzić czy rozwiązanie (w miarę) uniwersalne.
    auto thr1 = std::thread([&]{ cycle_run(period, worker, "abrakadabra"); });
    auto thr2 = std::thread([&]{ cycle_run(period, incrementer, std::ref(value)); });
    thr1.detach();
    thr2.detach();

    // Wykona 10 pętli wyświetlając wartość zmiennej w odstępach co 0.5 sekundy.
    for(auto i = 0; i < 10; ++i) {
        std::cout << "value = " << value << '\n';
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
}

Ale jeśli masz coś zwrócić z funkcji, lepsze będzie std::future. Najprościej wtedy użyć std::async.

Podobne pytania

0 głosów
2 odpowiedzi 164 wizyt
pytanie zadane 5 stycznia 2020 w PHP przez franz Gaduła (4,940 p.)
0 głosów
2 odpowiedzi 374 wizyt
pytanie zadane 24 grudnia 2019 w JavaScript przez milogab2004 Początkujący (440 p.)
0 głosów
1 odpowiedź 1,246 wizyt

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...