[C++] Attivare i thread periodicamente

di il
11 risposte

[C++] Attivare i thread periodicamente

Ciao a tutti Se io avessi due funzioni così:
void func_1{int a}
{
   //do something
}

void func_2{int b}
{
   //do something
}
Se volessi che le due funzioni vengano attivate periodicamente, ad esempio la func_1 ogni 200ms e la func_2 ogni 300ms, come potrei fare? (voglio che le due funzioni vengano eseguite periodicamente, anche se non hanno finito il loro task)

11 Risposte

  • Re: [C++] Attivare i thread periodicamente

    Con dei timer crei un thread per ogni funzione. Ma occhio che i thread in esecuzione potrebbero diventare eccessivi.

    Che devi fare esattamente?
  • Re: [C++] Attivare i thread periodicamente

    Intanto grazie, comunque devo fare due thread periodici che leggono i dati da un buffer, con i tempi che vengono passati da terminale (per esempio 100 ms e 200 ms). Il tutto ipotizzando che la lettura sia istantanea
    Mi daresti una dritta su come creare un timer per ogni thread?
  • Re: [C++] Attivare i thread periodicamente

    Allora mi sembra una cosa diversa. Allora i due thread, al loro interno ripeteranno le proprie operazioni ciclicamente ogni x ms.
  • Re: [C++] Attivare i thread periodicamente

    Esattamente!
  • Re: [C++] Attivare i thread periodicamente

    Per ogni funzione ti basta un ciclo in cui inserisci ciò che deve essere eseguito per la lettura del buffer e una chiamata alla sleep per fermare il thread per x ms
  • Re: [C++] Attivare i thread periodicamente

    Ok ho capito grazie!
  • Re: [C++] Attivare i thread periodicamente

    Non e' una buona idea quella di far partire un task se il precedente non e' terminato.

    Quello che puo' succedere e' che il task non ha terminato per qualche strano motivo, ad esempio perche' e' in loop. La conseguenza e' che continuerai a creare thread che vanno in loop fino a riempire la memoria. E appena un po' di memoria si libera, questa verra' usata da nuovi thread in loop.

    Se le memoria e' piena, con il codice che continua a tentare di generare nuovi thread che vanno in loop, ti ritrovi con una macchina TOTALMENTE congelata.
    L'unico modo per riprenderne il controllo e' quello di spegnerla e riaccenderlo.
    Per una macchina di produzione, non è una grande idea.
  • Re: [C++] Attivare i thread periodicamente

    Per una gestione sensata dei tempi, potresti fare così
    
    #include <iostream>
    #include <chrono>
    #include <thread>
    using namespace std;
    using namespace std::chrono; 
    
    void task(int n, int ms){
        while(1){
            auto begin = steady_clock::now();
            for (int i = 0; i < 100000000; i++); // job
            auto end = steady_clock::now();
            int duration = duration_cast<milliseconds>(end - begin).count();
            cout << "work time task " << n << " = " << duration << endl; 
            this_thread::sleep_for(milliseconds(ms - duration));
            cout << "tick task " << n << endl;    
        }
    }
     
    int main() {
        thread t1(task, 1, 2000);
        thread t2(task, 2, 3000);   
        t1.join();
        t2.join();
        return 0;
    }
    
  • Re: [C++] Attivare i thread periodicamente

    @Weierstrass
    ""gestione sensata" usando loop stretti??

    Come si suol dire: ""ma sei matto""

    Invece (ma questo non e' il caso), SE le scadenze sono abbastanza ""lasche"" (tipo dal secondo in su), le cose da fare non richiedono tanto tempo, basterebbe un singolo thread + una lista contenente i task ta eseguire e ogni quanto tempo eseguirli.

    Il thread, una volta al secondo, controlla se ci sono task da eseguire e li esegue.
    Poi si mette in attesa per il secondo successivo.

    SE si sa gia' che il task puo' richiede piu' di un secondo, allora lo si manda in esecuzione su un thread separato TENENDO traccia, pero' che al secondo successivo NON SI MANDA in esecuzione lo stesso taask un'altra volta, ma si aspetta che finisca.
  • Re: [C++] Attivare i thread periodicamente

    Sensata rispetto a un ritardo fisso alla fine, che altrimenti i clock derivano e non è rispettata più la richiesta iniziale.
  • Re: [C++] Attivare i thread periodicamente

    Considera che spesso devi fare dei lavori che non richiedono chissà quale precisione temporale.
    Che ne so: un dump su file di qualche tabella, la cancellazione di qualche cache, il log dello stato di qualche periferica ecc..

    Anche se fai l'operazione non perfettamente in orario, va bene lo stesso
Devi accedere o registrarti per scrivere nel forum
11 risposte