Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Timer
Forum - C/C++ - Timer

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 20:25
Martedì, 15/01/2013
Ciao a tutti,

Sto svolgendo un esercizio con i thread in cui mi viene richiesto di inserire da tastiera due parametri:
- Accuratezza
- Tempo massimo di attesa dopo cui i thread verranno chiusi.

L'algoritmo riguarda la serie per il calcolo di PI greco di Gregory Leibniz, ho risolto questa parte.

Però non riesco a capire come implementare il tempo, dovrei avere un tempo iniziale in cui faccio partire

i Thread a cui vado a sommare appunto l'attesa inserita dall'utente e nel momento in cui l'orario arriva

a (Attesa + T iniziale) esco......

C'è qualcuno che può darmi un suggerimento???

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:18
Martedì, 15/01/2013
Per la gestione del tempo, c' è la libreria time.h (http://www.cplusplus.com/reference/ctime/)

PM Quote
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 11:00
Sabato, 19/01/2013
Testo quotato

Postato originariamente da Poggi Marco:

Per la gestione del tempo, c' è la libreria time.h (http://www.cplusplus.com/reference/ctime/)



Non riesci a farmi un esempio pratico al fine di poter capire il funzionamento? Sono alle prime armi.....

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 11:56
Sabato, 19/01/2013
Alcuni esempi sono già nel sito. Cosa non riesci a capire?
(Posta il codice del tuo tentativo)

PM Quote
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 13:55
Sabato, 19/01/2013
io risolverei il tutto così

time_t oraAtt = time(NULL);
int t_max; //tempo espresso in secondi
i = 0;
for (i=0; i<10.000; i++)
{
   time_t oraAtt2 = time (NULL);
   if (double difftime(time_t oraAtt, time_t oraAtt2) == t_max)
   {
      break;
    }
}

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:36
Sabato, 19/01/2013
Il ciclo non funziona perché hai invertito gli argomenti passati alla finzione difftime (http://www.cplusplus.com/reference/ctime/difftime/).

La funzione difftime restituisce un valore double, quindi non è consigliabile utilizzare l' uguaglianza stretta nella condizione if, ma il maggiore_uguale.

PM Quote
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 15:15
Sabato, 19/01/2013
Testo quotato

Postato originariamente da Poggi Marco:

Il ciclo non funziona perché hai invertito gli argomenti passati alla finzione difftime (http://www.cplusplus.com/reference/ctime/difftime/).

La funzione difftime restituisce un valore double, quindi non è consigliabile utilizzare l' uguaglianza stretta nella condizione if, ma il maggiore_uguale.



Ti posto tutto il codice dell'esercizio - si compila, esegue i calcoli ma non rispetta il tempo!!!!
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <time.h>
  4. #include <math.h>
  5.  
  6. void *thread_function(void *arg)
  7. {
  8.     float pi_greco = 0;
  9.     float pi_grecotot = 0;
  10.     float error;
  11.     int i = 0;
  12.     int denominatore = 1;
  13.     float accuracy;
  14.     printf("Inserisci il grado di accuratezza : ");
  15.     scanf("%f", &accuracy);
  16.     do {
  17.         if (i%2 == 0) {
  18.             pi_greco = (float)4 / (float) denominatore;
  19.             denominatore = denominatore + 2;
  20.         }
  21.         else{
  22.             pi_greco = -(float)4 / (float)denominatore;
  23.             denominatore = denominatore + 2;
  24.         }
  25.         pi_grecotot = pi_grecotot + pi_greco;
  26.         i++;
  27.         error = pi_grecotot - M_PI;
  28.     } while (fabs(error) > accuracy);
  29.     printf("Il valore di pigreco approssimato a %f è %f\n", accuracy, pi_grecotot);
  30.    
  31. }
  32.  
  33. void *thread_check_time(void *arg)
  34. {
  35.     pthread_t thread_leibniz;
  36.     time_t oraAtt, oraAtt2;
  37.     int t_max;
  38.     double dif_sec;
  39.     printf("Inserisci il tempo massimo di attesa(espresso in secondi): ");
  40.     scanf("%d", &t_max);
  41.     if (t_max ==0)
  42.     {
  43.         printf("Inserisci un intervallo di tempo superiore a 0");
  44.     }
  45.     time(&oraAtt);
  46.     pthread_create(&thread_leibniz, NULL, thread_function, NULL);
  47.     while (dif_sec == t_max) {
  48.         time(&oraAtt2);
  49.         dif_sec = difftime(oraAtt2, oraAtt);
  50.     }
  51.     pthread_join(thread_leibniz,NULL);
  52.    
  53. }
  54.  
  55.  
  56. int main(void)
  57. {
  58.     pthread_t thread_time;
  59.     pthread_create(&thread_time, NULL, thread_check_time, NULL);
  60.     pthread_join(thread_time,NULL);
  61. }



il testo dell'esercizio è questo invece:
Scrivere un programma che attiva una serie di thread per effettuare il calcolo approssimato di π.

Il programma principale prende come input da riga di comando un parametro che indica il grado di accuratezza (accuracy) per il calcolo di π e il tempo massimo di attesa dopo cui il main interrompe tutti i thread.

I thread vengono utilizzati (cercando di massimizzare il numero di operazioni effettuate nel lasso di tempo a disposizione) per effettuare le seguenti operazioni per il calcolo di π tramite la serie di Gregory-Leibniz: π = 4/1 − 4/3 + 4/5 − 4/7 + 4/9 − 4/11 ...
    
I thread vengono tutti interrotti quando una delle due condizioni seguenti risulta verificata:
    
1) il tempo massimo di attesa è stato superato;
    
2) la differenza tra il valore stimato di π e il valore Math.PI è minore di accuracy.

PM Quote
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 13:36
Lunedì, 21/01/2013
Questo è il nuovo codice modificato:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <time.h>
  4. #include <math.h>
  5. #include <unistd.h>
  6.  
  7. time_t oraAtt;
  8.  
  9. void *thread_function(void *arg)
  10. {
  11.     float pi_greco = 0;
  12.     float pi_grecotot = 0;
  13.     float error;
  14.     int i = 0;
  15.     int denominatore = 1;
  16.     float accuracy;
  17.     accuracy =*(float*)arg;
  18.     do {
  19.         if (i%2 == 0) {
  20.             pi_greco = (float)4 / (float) denominatore;
  21.             denominatore = denominatore + 2;
  22.         }
  23.         else{
  24.             pi_greco = -(float)4 / (float)denominatore;
  25.             denominatore = denominatore + 2;
  26.         }
  27.         pi_grecotot = pi_grecotot + pi_greco;
  28.         i++;
  29.         error = pi_grecotot - M_PI;
  30.     } while (fabs(error) > accuracy);
  31.     printf("Il valore di pigreco approssimato a %f è %f\n", accuracy, pi_grecotot);
  32.     return NULL;
  33.    
  34. }
  35.  
  36. void *thread_check_time(void *arg)
  37. {
  38.     time_t oraAtt2;
  39.     double dif_sec;
  40.     int t_max;
  41.     t_max = *(int*)arg;
  42.     if (t_max == 0)
  43.     {
  44.         printf("Impossibile procedere tempo inserito uguale a 0");
  45.     }
  46.     //time(&oraAtt);
  47.     while (dif_sec <= t_max) {
  48.         time(&oraAtt2);
  49.         dif_sec = difftime(oraAtt2, oraAtt);
  50.     }
  51.     //0pthread_join(thread_leibniz,NULL);
  52.     return NULL;
  53.    
  54. }
  55.  
  56.  
  57. int main(void)
  58. {
  59.     int t_max;
  60.     int i;
  61.     float accuracy;
  62.     time(&oraAtt);
  63.     printf("inserisci il tempo massimo di attesa(espresso in secondi): ");
  64.     scanf("%d", &t_max);
  65.     printf("inserisci il grado di accuratezza");
  66.     scanf("%f", &accuracy);
  67.     pthread_t thread_time;
  68.     pthread_t thread_leibniz;
  69.     pthread_create(&thread_time, NULL, thread_check_time, &t_max);
  70.     for (i=0; i<4; i++){
  71.         pthread_create(&thread_leibniz, NULL, thread_function, &accuracy);  
  72.     }
  73. }



Però c'è qualcosa che non torna.....

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:10
Lunedì, 21/01/2013
Testo quotato

Postato originariamente da 88Leo88:Però c'è qualcosa che non torna.....



Cosa non torna?
Che valori hai assegnato a accuracy e t_max?

Nel thread che gestisce il tempo, la variabile dif_sec non è  inizializzata.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo