Brauche Hilfe bei einer laufenden Digitaluhr

sike0ne

Grünschnabel
Moin Leute.
Es ist mir zwar etwas unangenehm, dass ich gleich bei meinem 1. Beitrag ein Thema eröffne und eine Frage stelle, aber ich bin einfach am verzweifeln!

Es geht um folgendes:
Ich habe ein kleines Programm für die Windows-Konsole in C programmiert. Was es genau macht ist hierfür aber nicht weiter wichtig - es funktioniert ja alles wie geplant. Am anfang, bevor man überhaupt irgendwelche Eingaben macht, steht eine An/Einleitung für das Programm. Etwas darüber wird der Benutzername des Benutzerkontos ausgelesen - mit welchem man auch begrüßt wird. Etwas darüber steht dann einfach nur der Programmtitel und die Versionsnummer. Das man ganz unten die Eingaben tätigt versteht sich denke ich von selbst. Soweit so gut, wie gesagt, funktioniert alles 1a. Nur hätte ich gerne neben dem Benutzernamen eine digitale Uhr die weiter läuft.
Ich suche nun schon seit 3 Tage nach einer Lösung für mein Problem. Aber egal wo ich suche, ich entdecke immer nur Infos dazu, wie ich die Systemzeit auslese.
Das wurde mir zu bunt, so habe ich einfach selbst mit etwas probieren eine eigene Digitaluhr programmiert.
Ich schaffe es aber einfach nicht sie in mein Programm einzubinden :confused:'

Das ist der Code dafür:
Code:
/* Digitaluhr.c */

#include <time.h>
#include <windows.h>

int main(void)
{
    SetConsoleTitle(".:Eine kleine Digitaluhr 1.0.0 by sike0ne:.");
    {
        int Uhrzeit;
        while(1)
        {
            struct tm *newtime;
            time_t long_time;

            time( &long_time );
            newtime = localtime( &long_time );

            printf("Es ist %d:%d:%d Uhr\n", newtime->tm_hour, newtime->tm_min, newtime->tm_sec);

            Sleep(860);

            system("cls");
        }
    }
    return 0;
}

Das was Probleme macht, wenn ich sie z.B. mit "void DIGITALUHR()" etc. versuche einzubinden, ist denke ich das "system("cls");" da dann immer alles folgende gleich mitgelöscht wird, und somit der Rest des Programmes garnicht dargestellt werden kann. Da ist auch der Knackpunkt. Ich weiß nicht wie ich dieses Problem lösen kann.

Hoffe ihr versteht was ich meine und könnt vllt. helfen. Falls ich mich irgendwo falsch ausgedrückt habe, dann liegt das daran, dass ich mich gerademal wenige Wochen mit C befasse :-)

Ich arbeite unter WinXP/7 mit Code::Blocks und dem GNU GCC Compiler.

MfG
 
Willkommen im Forum :-)

Also die pure Uhr, von der du den Code zeigst funktioniert?

Hmm...ohne das echte Programm kann ich auch nichts genaues sagen.

Wenns wirklcih nur das system("cls") ist, lass das doch weg.
Ist außerdem noch extrem langsam, nicht wirklich gut für eine Uhr.

Die Uhr wird doch immer auf der gleichen Stelle angezeigt, oder?
Tauch doch einfach die Ziffern aus, wenn sich was geändert hat.

Mit WriteConsoleOutputCharacter (in der MSDN beschrieben) kannst du auf bestimmte Koordinaten in der Konsole schreiben (Koordinaten im Sinne von Buchstabenzeilen/Spalten, keine Pixel etc)

Dazu brauchst du noch GetStdHandle (beim Initialisieren).

Wenn du das originale Prog zeigst, könnte man halt besser helfen.
 
Hallo sike0ne,

abgesehen vom Positionierungsproblem, dass sich aber mit dem Tipp von sheel lösen lassen sollte, begibst du dich mit der Aufgabe auf das Feld der parallelen Programmierung. Da die Uhr ja permanent laufen soll, aber das übrige Programm auch bedienbar bleiben muss, benötigst du einen eigenen Thread für die Uhr.

Gruß
MCoder
 
Danke für die Schnelle Antwort :D

Ja, klar ist halt sehr Primitiv. Aber ich wusste mir nicht anders zu helfen. Wenn man das so kompiliert wie es ist, dann läuft sie. Wenn man das "system("cls");" weglässt, dann knallt er ja die Konsole komplett dicht mit der aktuellen Uhrzeit. Und die Pause die ich eingebaut hatte ist halt dafür, das die Uhr nicht nahezu durchgehend blinkt.

sheel hat gesagt.:
Mit WriteConsoleOutputCharacter (in der MSDN beschrieben) kannst du auf bestimmte Koordinaten in der Konsole schreiben (Koordinaten im Sinne von Buchstabenzeilen/Spalten, keine Pixel etc)

Dazu brauchst du noch GetStdHandle (beim Initialisieren).

Danke ;) werde mich mal schlau machen. Den Quelltext wollte ich eigentlich ungern posten, da ich nicht fertige Codes bekommen möchte - so lernt man nicht gerade viel. Sowas sehe ich nicht als Hilfe :D Das was du gemacht hast passt mir schon ganz gut, so weiß ich jetzt wonach ich schauen muss, und kann solange probieren bis es läuft - oder ich melde mich wieder :)

Wenns tatsächlich auf Anhieb klappen sollte, dann werde ich es hier natürlich auch nochmal posten, denn ich werde sicher nicht der Einzigste mit diesem Problem sein.

Edit: @MCoder: alles klar ;) Werde morgen mal etwas hin und her probieren.

MfG
 
Zuletzt bearbeitet:
Das mit dem Blinken kannst du auch leicht umgehen:
Du nimmst eine zweite Zeitvariable, die sich immer die Zeit merkt, die als letztes Ausgegeben wurde.
Wenn du dann die Zeit wieder abfragst, vergleichst du die zwei erst.
Nur wenn die "neue" Zeit eine Sekunde weiter ist als die "alte", gibst du das auch am Bildschirm aus (und natürlich die alt-Variable anpassen)
Wenns noch die gleiche Sekunde ist, einfach nicht ausgeben.

Dann kannst du die Sleep-Zeit verkleinern.
Eine große würde bei deinem Code zwar (auf Dauer) keine ungenaue Uhr ergeben, aber die Sekunden am Bildschirm dürften manchmal verschieden schnell wechseln.
Ganz weglassen solltest du das Sleep aber auch nicht, das schont den Prozessor (rennt sonst auf 100%)
 
Zuletzt bearbeitet:
Zurück