Zeitmessung in C/C++
-
Ich würd für ein Physikexperiment gern meinen Laptop in eine Stopuhr umwandeln.
Leertaste soll Zeitmessung starten oder stoppen und danach sollen die Berechnungen ausgeführt werden.
Wie könnt ich da rangehen? Ich hab schon ein Programm in Python geschrieben das tut was ich will, aber ich hab da zu Beginn unangenehme Verzögerungen, die die Ergebnisse verfälschen. Meine Hoffnung ist, dass C etwas fixer auf den Tastendruck reagiert, die eigentliche Zeitmessung ist genau genug.
Wenn gewünscht kann ich mein Python-Programm gern posten, aber das nimmt wahrscheinlich nur Platz weg.
-
Das Programm kannste mit time starten => time rechenprogramm.
-
Nein, ich will die Zeit zwischen zwei Tastendrücken, nicht die Laufzeit des Programms. Ich denke mit der Zeitmessung komm ich schon zurecht, da gibts irgeneinen time.h header oder so ...
Aber wie realisiere ich die Steuerung über Leertaste? Ich hab null Ahnung wie man sowas in C machen könnt.
In meinem Python-Programm wird über modul "termios" eine Art pseudo-Datei erstellt, die die stdin Eingabe erhält und dann mit os.read() 1-byte-weise gelesen wird.
os.read() stoppt die Schleife, bis wieder ein Zeichen im Puffer ist.
Wird " " gelesen, dann wird ein Counter erhöht und je nach Counter-Stand eine Funktion ausgeführt. "q" beendet das Programm, sonst reagiert das Programm auf keine Eingaben.
-
Hast du mal im Internet nach einem solchen Programm gesucht? Vielleicht hat das schon jemand gemacht, also wozu der Aufwand?
-
Ich hab jetzt was zusammengebastelt, das geht in C genauso über termios. Ist aber auch nicht schneller als in Python.
Falls mal jemand sowas sucht:
#include <iostream> #include <termio.h> #include <sys/timeb.h> using namespace std; struct termios new_settings; struct termios stored_settings; struct timeb tp; void set_keypress(void) { tcgetattr(0,&stored_settings); new_settings = stored_settings; new_settings.c_lflag &= (~ICANON); new_settings.c_cc[VTIME] = 0; tcgetattr(0,&stored_settings); new_settings.c_cc[VMIN] = 1; tcsetattr(0,TCSANOW,&new_settings); } void reset_keypress(void) { tcsetattr(0,TCSANOW,&stored_settings); } int main () { set_keypress(); int counter = 3; int input = 0; double start_first; double end_first; double start_second; double end_second; while (1) { input = getchar(); while (input == -1) { continue; } if (input == 32) { ftime(&tp); counter = (counter+1)%4; } else if (input == 113) { break; } switch (counter) { case 0: start_first = tp.time+tp.millitm/1000.; cout << " Start der ersten Zeitmessung" << endl; break; case 1: end_first = tp.time+tp.millitm/1000.; cout << " Ende der ersten Zeitmessung" << endl; cout << "\t" << end_first - start_first << endl; break; case 2: start_second = tp.time+tp.millitm/1000.; cout << "Start der zweiten Zeitmessung" << endl; break; case 3: end_second = tp.time+tp.millitm/1000.; cout << " Ende der zweiten Zeitmessung" << endl; cout << "\t" << end_second - start_second << endl; break; } } }
-
Hi probier das hier mal aus. Ist vielleicht ein bischen schneller:
#include <iostream> #include <cstdlib> using namespace std; int main() { // Variablen: char Auswahl; time_t seconds; time_t begin; time_t end; cout << "Beliebige Taste druecken um zu starten." << endl; cin >> Auswahl; cout << "Beliebige Taste druecken um zu beenden." << endl; if (Auswahl != NULL) { begin = time (NULL); cin >> Auswahl; } end = time (NULL); seconds = end - begin; cout << "Sekunden: " << seconds << endl; return 0; }
-
Kleine Anregung:
#include <termios.h> #include <ctime> #include <string> #include <iostream> using namespace std; /* http://www.c-plusplus.net/forum/viewtopic-var-p-is-285476.html#285476 */ int getch() { int fd = fileno(stdin); struct termios neu, alt; tcgetattr(fd, &alt); neu = alt; neu.c_lflag &= ~(ICANON|ECHO); tcsetattr(fd, TCSANOW, &neu); int ch = getchar(); tcsetattr(fd, TCSANOW, &alt); return ch; } /* http://www.c-plusplus.net/forum/viewtopic-var-p-is-1567908.html#1567908 */ class timer { struct timespec ts_start, ts_end; clockid_t id; public: void start() { clock_gettime(id, &ts_start); } void stop() { clock_gettime(id, &ts_end); } timer(clockid_t clock = CLOCK_MONOTONIC) { id = clock; start(); } friend std::ostream & operator<<(std::ostream& os, const timer &t); }; std::ostream & operator<<(std::ostream& os, const timer &t) { unsigned long ns = (t.ts_end.tv_sec - t.ts_start.tv_sec) * 1000000000 + t.ts_end.tv_nsec - t.ts_start.tv_nsec; string ext = "ns"; if (ns >= 10000) { ns /= 1000; ext = "us"; } if (ns >= 10000) { ns /= 1000; ext = "ms"; } if (ns >= 10000) { ns /= 1000; ext = "s"; } os << ns << " " << ext; return os; } int main() { int ch, n = 0; timer t; while ((ch = getch()) != -1) { if (ch == 'q') break; if (ch != ' ') continue; n++; if (n & 1) { cout << "Start der " << ((n + 1) / 2) << ". Messung: " << flush; t.start(); } else { t.stop(); cout << t << endl; } } }