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

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

Δημοσ.

Καλησπέρα,

 

Φτιάχνω ένα απλό παιχνιδάκι σε C, και θέλω να μετράω τον χρόνο που παίζει ο χρήστης σε δευτερόλεπτα. Προς το παρόν χρησιμοποιώ την time της time.h χωρίς πρόβλημα.

 

Παρόλα αυτά, εφόσον η time πέρνει την ώρα από τον υπολογιστή μου φαίνεται ότι δεν είναι η πιο αξιόπιστη λύση. Για παράδειγμα, φαντάζομαι, αν ενημερωθεί η ώρα από το ίντερνετ και πάει 1-2 λεπτά πίσω ή αν ο χρήστης πειράξει επίτηδες το ρολόι, αυτό θα έχει επίπτωση στο χρονόμετρο του προγράμματος.

 

Τι άλλες λύσεις υπάρχουν; Χρησιμοποιώ ήδη windows.h για κάποια πράγματα οπότε δεν λεω όχι και σε windows specific λύσεις. 

 

Ευχαριστώ.

Δημοσ.

Θα μπλέξεις!

 

Ή κράτα το απλό (π.χ με clock() ή με posix clock_settime()/clock_gettime() με CLOCK_MONOTONIC αν υποστηρίζεται στην πλατφόρμα σου) με συνειδητή αποδοχή των approximation errors, ή χρησιμοποιήσε κάποια έτοιμη βιβλιοθήκη.

 

EDIT:

 

Π.χ. μια απλή stopwatch library με clock_gettime(CLOCK_MONOTONIC) (λέει πως ο mingw υποστηρίζει CLOCK_MONOTONIC... αν και δεν το έχω ψάξει).

  • Like 1
Δημοσ.

Ευχαριστώ. Η clock() φαινεται καλή εναλλακτική μιας και από οτι ειδα δεν βασίζεται στο ρολόι των windows. Το χρονόμετρο μου μετράει ακέραια δευτερόλεπτα, οπότε δεν με νοιάζει καλύτερη ακρίβεια από αυτό. Υπάρχει όμως περίπτωση(έστω και ακραία) η clock να ξεφύγει τόσο πολύ ωστε να πηδάει και δευτερόλεπτα ας πούμε;

Δημοσ.

Ευχαριστώ. Η clock() φαινεται καλή εναλλακτική μιας και από οτι ειδα δεν βασίζεται στο ρολόι των windows. Το χρονόμετρο μου μετράει ακέραια δευτερόλεπτα, οπότε δεν με νοιάζει καλύτερη ακρίβεια από αυτό. Υπάρχει όμως περίπτωση(έστω και ακραία) η clock να ξεφύγει τόσο πολύ ωστε να πηδάει και δευτερόλεπτα ας πούμε;

Δεν νομίζω. Αλλά δεν μετράει χρόνο των τυχόν child processes (αν το θυμάμαι καλά), κι επίσης πρέπει να τσεκάρεις αν ο compiler σου την υλοποιεί σωστά (γιατί νομίζω πως σε Windows, καποιοι compilers την βάζουν να επιστρέφει wall-clock-time αντί για cpu-time... ψάξτο στην τεκμηρίωση της time.h που χρησιμοποιείς).

 

ΥΓ. Btw, για να πάρεις secs, πρέπει να διαιρέσεις την clock() με CLOCKS_PER_SEC. Τέλος, αν βρεις χρόνο, και σε ενδιαφέρει φυσικά, δες το λινκ που σου έδωσα για να πάρεις μια γεύση περί τι είδους "nightmare" μιλάμε στον ευρύτερο τομέα του όρου: timer :P

  • Like 2
Δημοσ.

Εχω αυτο για να μετραω την εκτελεση
δες το αν θες

#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
  • Like 1
Δημοσ.

Ευχαριστώ. Προς το παρόν θα κρατήσω το clock() γιατι μετράω τον χρόνο εκτός του windows layer, αλλά δεν ειναι απίθανο αυτό να αλλάξει στην πορεία.

Δημοσ.

 Να ρωτησω και εγώ κάτι σχετικό σε περίπτωση που η CPU κάνει 1 sec και το IO κάνει άλλο ένα τι θα μετρήσει η clock() ?

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

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

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

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

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

Σύνδεση

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

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