Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

>
#include <stdio.h>
int main()
{
    int time_left=10;
    while(time_left>0){
		    sleep(1);

/.............. simulator...................../
		    time_left-=1;
		    printf("%d\n",time_left);
    }
    return 0;
}

 

αν θέλω να τρέξω ένα πρόγραμμα για 10 sec είναι σωστός ο παραπάνω τρόπος, δηλαδή να ενσωματώσω τον υπόλοιπο κώδικα εκεί που λέω simulator;

δεν μου φαίνεται ok γι αυτό ρωτάω, θέλω δηλαδή να ορίζω την time_left = 10 δευτερόλεπτα και θέλω γι αυτά τα 10 sec το πρόγραμμα να τρέχει συνεχώς

Δημοσ.

Πολύ γενικά θα έλεγα ότι και ο ίδιος ο κώδικας του "simulator" θα πρέπει να εξετάζει τον χρόνο που περνάει κατά την εκτέλεση του και αν ξεπερνά το χρονικό περιθώριο που ορίζεις να διακόπτει καθώς ο έλεγχος μέσο της συνθήκης while δεν αρκεί (αν υποθέσουμε ότι ο simulator τρέχει κώδικα με επαναλήψεις κλπ).

 

Για την ιστορία, το χρονόμετρο θα μπορούσε να γραφεί και ως εξής:

 

 

>
/* Stop on 10" .. */

#include <stdio.h>
#include <time.h>

#define _STOP_ON_SEC 10 + 1

int runSimulation(const time_t tStart);

int main(void)
{
/* Start time is constant */
const time_t tStart = time(NULL);
/* Ellapsed time is not */
time_t tLeft;

/* Seconds left? */
while((tLeft = time(NULL) - tStart) < _STOP_ON_SEC)
{
	static time_t tLeftBak = 0;

	if(tLeft != tLeftBak)
		printf("%d\" - %d\" left \n", tLeft, _STOP_ON_SEC - tLeft);

	tLeftBak = tLeft;

	/* Simulate.. */
	if(!runSimulation(tStart))
		break;
}

puts("Time out, press Enter to exit..");
getchar();

return 0;
}

int runSimulation(const time_t tStart)
{
return 1; /* or 0 when we time-out during Simulation! */
}
}}

 

ΕΞΟΔΟΣ:

>
1" - 10" left
2" - 9" left
3" - 8" left
4" - 7" left
5" - 6" left
6" - 5" left
7" - 4" left
8" - 3" left
9" - 2" left
10" - 1" left
Time out, press Enter to exit..

 

Δημοσ.

Γενικά, απέφυγε το sleep().

 

Κάτι εύκολο να υλοποιηθεί (με περιορισμένη ακρίβεια χρόνου) και κοντά στο στυλ που θέλεις είναι:

 

#include <stdio.h>

#include <time.h>

 

int main () {

 

time_t startTime = time(NULL); // will return time in seconds starting January 1, 1970

time_t timeNow = startTime;

 

while (timeNow < startTime + 10) {

 

/* Add activities here */

 

timeNow = time(NULL);

}

}

 

Δεν έχω κάνει compile τον παραπάνω κώδικα, λογικά όμως θα δουλεύει.

Δημοσ.

Όπως λένε τα παιδιά. Με τη sleep αυτό που θα γίνει είναι ότι το πρόγραμμά σου δε θα κάνει σχεδόν τίποτα για 10 sec.

 

Επίσης έχε υπόψη ότι αν αυτό που κάνεις μέσα στο loop είναι σχετικά γρήγορο, το να εκτελείς την time() ή κάποια παρόμοια συνάρτηση σε κάθε επανάληψη του loop όπως γίνεται στον κώδικα παραπάνω θα έχει μετρήσιμη και πολύ αρνητική επίδραση στην απόδοση του προγράμματος (και επίσης δεν προσφέρει τίποτα).

 

Παράδειγμα.

 

Να ξέρεις ότι με τη μέθοδο της time() θα έχεις χρόνο εκτέλεσης κάπου στο διάστημα (9, 11) δευτερόλεπτα, ποτέ ακριβώς 10. Αυτό ισχύει και για το παράδειγμα που δίνω παραπάνω (οπότε οι μετρήσεις είναι κάθε άλλο παρά ακριβείς, όμως η διαφορά είναι τόσο μεγάλη που παρόλα αυτά βγάζει μάτι).

Δημοσ.

Ειδικά σε multitask περιβάλλοντα υπάρχει πάντα ο κίνδυνος να υπάρξει καθυστέρηση κατά την διάρκεια εκτέλεσης του προγράμματος για διάφορους λόγους. Ένας τρόπος επίλυσης αυτού του προβλήματος είναι ο υπολογισμός του χρόνου με όσο το δυνατόν υψηλότερης ακρίβειας "χρόνο-μονάδες" (για παράδειγμα MS) ώστε να μπορείς να διαχειριστείς εύκολα την διαφορά που μπορεί να προκύψει κατά την εκτέλεση της χρονομέτρησης λόγο φόρτου εργασίας του συστήματος κλπ (και που μπορεί να είναι μερικά MS που αν μαζευτούν πολλά όμως οδηγούν σε απόλια SECOND(S) κλπ) ή ειδικών συναρτήσεων που μπορεί να προσφέρει το λειτουργικό (βλ. High Resolution Timers σε WinAPI, έχει συζητηθεί παλαιότερα στο forum εδώ, εδώ & εδώ) αλλά για την παρούσα ερώτηση μάλλον οι λύσεις αυτές (πέραν της clock) μου φαίνονται overkill.

Δημοσ.

Δεν ξέρω κατά πόσο θα σου φανούν χρήσιμες, αλλά παραθέτω 2 απλές και μια πιο σύνθετη συνάρτηση για timing...

 

 

 

>
#include <stdio.h>
#include <time.h>

// ---------------------------------------------------------------------------------
void timer1()
{
clock_t tend, tstart;
double cpu_time_used = 0.0;

tsatrt = clock();
/* Code you want timed here */
tend = clock();
cpu_time_used = ((double) (tend - tstart)) / CLOCKS_PER_SEC;

printf("Time elapsed: %f\n", cpu_time_used);

return;
}

// ---------------------------------------------------------------------------------
void timer2()
{
time_t tstart = time(NULL);

/* Code you want timed here */

time_t tstop = time(NULL);
double duration = difftime(tstop,tstart);

return;
}

#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <time.h>
#endif

/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
* windows and linux. */

// ---------------------------------------------------------------------------------
uint64_t GetTimeMs64()
{
#ifdef WIN32
/* Windows */
FILETIME ft;
LARGE_INTEGER li;
uint64 ret;

/* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC)
 * and copy it to a LARGE_INTEGER structure.
 */
GetSystemTimeAsFileTime(&ft);
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;

ret = li.QuadPart;
ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */

return ret;
#else
/* Linux */
struct timeval tv;
uint64 ret;

gettimeofday(&tv, NULL);

ret = tv.tv_usec;
/* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
ret /= 1000;

/* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
ret += (tv.tv_sec * 1000);

return ret;
#endif
}

 

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...