bnvdarklord Δημοσ. 9 Φεβρουαρίου 2015 Δημοσ. 9 Φεβρουαρίου 2015 Καλησπέρα, Φτιάχνω ένα απλό παιχνιδάκι σε C, και θέλω να μετράω τον χρόνο που παίζει ο χρήστης σε δευτερόλεπτα. Προς το παρόν χρησιμοποιώ την time της time.h χωρίς πρόβλημα. Παρόλα αυτά, εφόσον η time πέρνει την ώρα από τον υπολογιστή μου φαίνεται ότι δεν είναι η πιο αξιόπιστη λύση. Για παράδειγμα, φαντάζομαι, αν ενημερωθεί η ώρα από το ίντερνετ και πάει 1-2 λεπτά πίσω ή αν ο χρήστης πειράξει επίτηδες το ρολόι, αυτό θα έχει επίπτωση στο χρονόμετρο του προγράμματος. Τι άλλες λύσεις υπάρχουν; Χρησιμοποιώ ήδη windows.h για κάποια πράγματα οπότε δεν λεω όχι και σε windows specific λύσεις. Ευχαριστώ.
migf1 Δημοσ. 9 Φεβρουαρίου 2015 Δημοσ. 9 Φεβρουαρίου 2015 Θα μπλέξεις! Ή κράτα το απλό (π.χ με clock() ή με posix clock_settime()/clock_gettime() με CLOCK_MONOTONIC αν υποστηρίζεται στην πλατφόρμα σου) με συνειδητή αποδοχή των approximation errors, ή χρησιμοποιήσε κάποια έτοιμη βιβλιοθήκη. EDIT: Π.χ. μια απλή stopwatch library με clock_gettime(CLOCK_MONOTONIC) (λέει πως ο mingw υποστηρίζει CLOCK_MONOTONIC... αν και δεν το έχω ψάξει). 1
bnvdarklord Δημοσ. 9 Φεβρουαρίου 2015 Μέλος Δημοσ. 9 Φεβρουαρίου 2015 Ευχαριστώ. Η clock() φαινεται καλή εναλλακτική μιας και από οτι ειδα δεν βασίζεται στο ρολόι των windows. Το χρονόμετρο μου μετράει ακέραια δευτερόλεπτα, οπότε δεν με νοιάζει καλύτερη ακρίβεια από αυτό. Υπάρχει όμως περίπτωση(έστω και ακραία) η clock να ξεφύγει τόσο πολύ ωστε να πηδάει και δευτερόλεπτα ας πούμε;
migf1 Δημοσ. 9 Φεβρουαρίου 2015 Δημοσ. 9 Φεβρουαρίου 2015 Ευχαριστώ. Η clock() φαινεται καλή εναλλακτική μιας και από οτι ειδα δεν βασίζεται στο ρολόι των windows. Το χρονόμετρο μου μετράει ακέραια δευτερόλεπτα, οπότε δεν με νοιάζει καλύτερη ακρίβεια από αυτό. Υπάρχει όμως περίπτωση(έστω και ακραία) η clock να ξεφύγει τόσο πολύ ωστε να πηδάει και δευτερόλεπτα ας πούμε; Δεν νομίζω. Αλλά δεν μετράει χρόνο των τυχόν child processes (αν το θυμάμαι καλά), κι επίσης πρέπει να τσεκάρεις αν ο compiler σου την υλοποιεί σωστά (γιατί νομίζω πως σε Windows, καποιοι compilers την βάζουν να επιστρέφει wall-clock-time αντί για cpu-time... ψάξτο στην τεκμηρίωση της time.h που χρησιμοποιείς). ΥΓ. Btw, για να πάρεις secs, πρέπει να διαιρέσεις την clock() με CLOCKS_PER_SEC. Τέλος, αν βρεις χρόνο, και σε ενδιαφέρει φυσικά, δες το λινκ που σου έδωσα για να πάρεις μια γεύση περί τι είδους "nightmare" μιλάμε στον ευρύτερο τομέα του όρου: timer 2
παπι Δημοσ. 10 Φεβρουαρίου 2015 Δημοσ. 10 Φεβρουαρίου 2015 Εχω αυτο για να μετραω την εκτελεσηδες το αν θες #pragma once #include <Windows.h> namespace Utility { class Timer { LARGE_INTEGER start; LARGE_INTEGER end; LARGE_INTEGER fq; LONGLONG ms(){ QueryPerformanceCounter(&end); return ((end.QuadPart - start.QuadPart) * 1000) / (fq.QuadPart); } LONGLONG ns(){ QueryPerformanceCounter(&end); return ((end.QuadPart - start.QuadPart) * 1000000) / (fq.QuadPart); } public: void Start(){ QueryPerformanceCounter(&start); QueryPerformanceFrequency(&fq); } LONGLONG End(){ return ms(); } void End(LPCWSTR dbgMsg){ WCHAR buf[200]; wsprintf(buf,L"%ls:%dns\r\n",dbgMsg, ns()); OutputDebugString(buf); } }; } #if USING_CODE_TIMER == 1 #define CODE_TIMER_START(id) \ Utility::Timer __code_timer_##id;\ __code_timer_##id.Start();\ #define CODE_TIMER_END(id,msg) \ __code_timer_##id.End(msg); #else #define CODE_TIMER_START(id) #define CODE_TIMER_END(id,msg) #endif 1
bnvdarklord Δημοσ. 10 Φεβρουαρίου 2015 Μέλος Δημοσ. 10 Φεβρουαρίου 2015 Ευχαριστώ. Προς το παρόν θα κρατήσω το clock() γιατι μετράω τον χρόνο εκτός του windows layer, αλλά δεν ειναι απίθανο αυτό να αλλάξει στην πορεία.
Aztec Δημοσ. 10 Φεβρουαρίου 2015 Δημοσ. 10 Φεβρουαρίου 2015 Να ρωτησω και εγώ κάτι σχετικό σε περίπτωση που η CPU κάνει 1 sec και το IO κάνει άλλο ένα τι θα μετρήσει η clock() ?
παπι Δημοσ. 11 Φεβρουαρίου 2015 Δημοσ. 11 Φεβρουαρίου 2015 Το clock πρακτικα μετραει 1/1000 sec, δηλαδη τρεχει στο 1kHz. Με ενα kHz δεν πιανεις ουτε την δισκετα που λεει ο λογος.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα