Zeitabfrage
-
und wie macht man das nun?
-
Du wartest, bis eine Taste gedrückt wurde. Den Zeitpunkt merkst du dir und wartest auf den nächsten Tastendruck. Dann gibst du die Differenz aus.
-
die Vorgengsweise ist mir schon klar, aber ich weiß nicht wie man immer den vorletzten Wert speichert. Also wie ein Schieberegister oder so?
-
Schlag mal Variablen in deinem Buch nach.
-
Du nimmst eine Variable mit dem Namen letzterWert und weist der den Wert der letzten Zeitmessung zu.
-
ja, das habe ich schon gemacht, das Problem ist, dass diese Variable immer überschrieben wird wenn wieder die taste gedrückt wird. ich müßte also 2 variablen verwenden die immer wieder überschrieben werden
-
Thorsten777 schrieb:
ja, das habe ich schon gemacht, das Problem ist, dass diese Variable immer überschrieben wird wenn wieder die taste gedrückt wird. ich müßte also 2 variablen verwenden die immer wieder überschrieben werden
Zeig mal Code.Vorgehen allgemein: Du hast zwei Variablen, in eine schreibst du am Anfang die Zeit in eine andere am Ende. Dann bildest du die Differenz. Was du das jetzt überschreiben willst, verstehe ich nicht.
-
SYSTEMTIME st, lt; for (;;) { GetLocalTime(<); cin >> eingabe; int letzterwert = lt.wMilliseconds; cout << "aktueller Wert-letzter Wert " << lt.wMilliseconds-letzterwert << endl; }
-
letzterwert = lt.wMilliseconds;
Nächste Zeile:
lt.wMilliseconds-letzterwert
Hmm, was mag da wohl rauskommen?Vielleicht solltest du nochmal die Reihenfolge überdenken.
Noch zwei weitere Tipps:
1. Ja, die Variablen die du in der Schleife definierst werden bei jedem Durchlauf überschrieben. Schlecht für eine Variable die sich den Wert vom letzten Durchlauf merken soll.
2. Wenn du die Variablendeklaration von letzterwert vor die Schleife legst, kannst du dem Variablen auch schon einen vernünftigen Startwert geben, so dass beim ersten Durchlauf schon ein vernünftiges Ergebnis rauskommt.Mit diesen drei Hinweisen und ein wenig nachdenken solltest du das hinbekommen können.
-
Mach es doch einfach so:
SYSTEMTIME start, end; while (true) { GetLocalTime(&start); getchar(); GetLocalTime(&end); int differenz = end.wMilliseconds - start.wMilliseconds cout << "Differenz = " << differenz << endl; }Ungestet und keine Ahnung ob das so genau funktioniert. Aber das Prinzip müsste stimmen.
Und die Erklärung:
Du ermittelst die aktuelle Zeit und speicherst sie in start.
Dann wartest du, bis der Benutzer eine Taste drückt.
Dann ermittelst du wieder die aktuelle Zeit und speicherst sie in end.
Dann berechnest du die Differenz und gibst sie aus.Ich hoffe du hast es jetzt verstanden.
-
Ja, das funktioniert, danke.
Aber die Millisekunden alleine reichen mir nicht, ist zu kurz.
Die Dauer soll ein paar Sekunden sein aber die Genauigkeit in ms.Ich habe schon versucht Sekunden und Millisekunden zu addieren,aber beim Überlauf kommts dann zu negativen Werten, und ich müßte dann einiges berücksichtigen.
Gibts da vielleicht eine Funktion die das berechnet?
-
Es gibt eine passendere Funktion: GetTickCount(). Damit hast du nur einen Wert, mit dem du bequem rechnen kannst.
-
super, danke
jetzt zum nächsten Problem
ich habe eine Client-Server-Anwendung, der Client sendet in Abständen von Sekunden eine Nachricht.
Diese kommt auch am Server an. Nun möchte ich immer dann wenn eine neue Nachricht kommt die Zeit messen.Aber wie mache ich so eine Abfrage, geht das mit getbuf()?buf[rc]='\0'; // daten ausgeben und eine antwort senden printf("Client %d hat folgendes gesandt: %s\n",i,buf); //Aufrufen der Funktion zur Zeitauslesung DWORD time1; time1=GetTickCount(); // ............................Hier soll abgefragt werden ob Client eine neue Nachricht gesendet hat DWORD time2; time2=GetTickCount(); cout <<" Zeit = " << (time2-time1);
-
Kann mir da jetzt jemand weiterhelfen?
hier mal der vollständige Abschnitt:
// prüfen wlecher client sockets im fd_set sind for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { continue; // ungültiger socket, d.h. kein verbunder client an dieser position im array } if(FD_ISSET(clients[i],&fdSet)) { rc=recv(clients[i],buf,256,0); // prüfen ob die verbindung geschlossen wurde oder ein fehler auftrat if(rc==0 || rc==SOCKET_ERROR) { printf("Client %d hat die Verbindung geschlossen\n",i); closesocket(clients[i]); // socket schliessen clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben } else { // daten ausgeben und eine antwort senden printf("Client %d hat folgendes gesandt: %s\n",i,buf); //Aufrufen der Funktion zur Zeitauslesung DWORD time1; DWORD time2; time1=GetTickCount(); // ............................Hier soll abgefragt werden ob Client eine neue Nachricht gesendet hat time2=GetTickCount(); cout <<" Zeit = " << (time2-time1);also bei Eingabe über Tastatur könnte man getchar() verwenden, aber es soll ja auf eine Nachricht des Clients gewartet werden.
-
hat da niemand eine Idee?
-
Nö, ich habe keine Ahnung, was du jetzt willst.
Wie deine Nachrichten aufgebaut sind, musst du schon selbst wissen. Und dann überprüfst du eben, ob bereits eine vollständige Nachricht empfangen wurde.
Bis dahin musst du die empfangenen Daten zwischenspeichern.