??? Echtzeituhr in einem Konsolenprogramm einbauen ???

Direkte Linux-Programmierung, POSIX
Antworten
3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

??? Echtzeituhr in einem Konsolenprogramm einbauen ???

Beitrag von 3VAD_YNCAL » So Mai 06, 2012 3:37 pm

Hallo zusammen,

ich schreibe gerade ein Konsolen-Programm unter Linux (Ubuntu), mit dem man wichtige Daten, z.B. Account-Daten (Benutzer/Passwörter) verschlüsselt abspeichern und wieder abrufen kann. Im Programm ist es auch möglich mehrere Benutzer anzulegen, die jeweils ihre Daten sicher abspeichern und abrufen können. Nun habe ich aber folgendes Problem. Ich möchte gerne noch eine Echtzeit-Uhr in das Programm einbauen. Praktisch soll die Uhrzeit ständig angezeigt werden mit Sekunden. Aber ich weiß nicht so genau wie ich das umsetzen soll.
Ich habe mal folgendes kleines Programm geschrieben um zu demonstrieren, wie das ungefähr aussehen sollte bzw. könnte. Doch so wird das in der Praxis sicherlich nicht gemacht, denke ich mal. Nun erstmal der Code:

Code: Alles auswählen

/* clock_3.c */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#define  clrscr() 	  printf("\033[2J")
#define  pos( x, y )	printf("\033[%d;%dH", x, y)

int main()
{
    time_t dat_clock;
    struct tm *zeitInfo;
    char   puffer[ 80 ];

    clrscr();

    while( 1 )
    {
	    sleep( 1 );
    	time( &dat_clock );
    	zeitInfo = localtime( &dat_clock );
    	pos( 1, 1 );
    	strftime( puffer, 80, "\nUhrzeit: %X | Datum: %x | Tag: %A", zeitInfo );
    	fputs( puffer, stdout );
    }

    return EXIT_SUCCESS;
}
Meine Frage ist, wie könnte ich eine Funktion schreiben, die eine Echtzeit-Uhr anzeigt und zwar so, dass es keinen Einfluss auf den restlichen Programmablauf hat. Damit meine ich, dass man zwischen den Menüs im Programm hin und her springen kann und die Uhrzeit mit Datum usw. an einer ausgewählten Stelle schön immer mit läuft? Muss man dafür einen Thread programmieren oder geht das auch einfacher?

Würde mich sehr über ein paar Tipps von euch freuen. :)

3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Re: ??? Echtzeituhr in einem Konsolenprogramm einbauen ???

Beitrag von 3VAD_YNCAL » So Mai 06, 2012 10:35 pm

An den Admin: Könnte man diesen Thread in C/C++ verschieben? Ich glaube nämlich das ich hier falsch bin. Sorry. :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: ??? Echtzeituhr in einem Konsolenprogramm einbauen ???

Beitrag von Xin » So Mai 06, 2012 11:01 pm

3VAD_YNCAL hat geschrieben:Meine Frage ist, wie könnte ich eine Funktion schreiben, die eine Echtzeit-Uhr anzeigt und zwar so, dass es keinen Einfluss auf den restlichen Programmablauf hat. Damit meine ich, dass man zwischen den Menüs im Programm hin und her springen kann und die Uhrzeit mit Datum usw. an einer ausgewählten Stelle schön immer mit läuft? Muss man dafür einen Thread programmieren oder geht das auch einfacher?
Es kommt drauf an, ob Du eine Funktion des Betriebsystems rufst, die Dein Programm anhält - z.B. scanf.
Dann musst Du Threads nehmen.
Wie willst Du die Menüs umsetzen und kann die Programmsteuerfunktion regelmäßig Deine Funktion zum Update der Uhr aufrufen?

Schlussendlich wird es wohl auf Threads hinauslaufen. :)

So schlecht ist der Thread hier doch gar nicht positioniert.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Re: ??? Echtzeituhr in einem Konsolenprogramm einbauen ???

Beitrag von 3VAD_YNCAL » Mo Mai 07, 2012 3:55 pm

Hallo Xin, du hast mir schon bei meinem letzten Thread super geholfen. Das Programm was ich ursprünglich geplant hatte ist fast fertig. Dank deiner Tipps bzgl. der ID's. :P Nochmals vielen vielen Dank dafür. Sobald es komplett fertig ist, würde ich dir gerne den gesamten Quellcode (sehr gut dokumentiert) schicken. Falls du Lust, Zeit und Interesse hättest es zu analysieren. Evtl. Verbesserungsvorschläge machen usw. Also nur wenn du willst, natürlich. :)
Nun zu meinem jetzigen Problem:
Xin hat geschrieben:
3VAD_YNCAL hat geschrieben:Meine Frage ist, wie könnte ich eine Funktion schreiben, die eine Echtzeit-Uhr anzeigt und zwar so, dass es keinen Einfluss auf den restlichen Programmablauf hat. Damit meine ich, dass man zwischen den Menüs im Programm hin und her springen kann und die Uhrzeit mit Datum usw. an einer ausgewählten Stelle schön immer mit läuft? Muss man dafür einen Thread programmieren oder geht das auch einfacher?
Es kommt drauf an, ob Du eine Funktion des Betriebsystems rufst, die Dein Programm anhält - z.B. scanf.
Dann musst Du Threads nehmen.
Das Programm wird, sowohl durch Funktionen des Betriebssystems als auch durch selbst geschriebene Funktionen zur Eingabe von Daten, angehalten.
Xin hat geschrieben:Wie willst Du die Menüs umsetzen und kann die Programmsteuerfunktion regelmäßig Deine Funktion zum Update der Uhr aufrufen?
Leider kann die Programmsteuerfunktion die Uhrzeit nicht regelmäßig updaten. Weil ich nicht weiß wie ich das umsetzen könnte. Ich hätte es gerne so, dass die Uhrzeit, unabhängig davon in welchem Menü man sich gerade befindet oder ob man gerade was eingeben muss (bspw. Namen, Passwort etc.), ständig mitläuft (inkl. Sekunden -> z.B. "16:43:45 Uhr"). Am besten sollte die Uhr an einer festen Position innerhalb des Programms verankert sein -> z.B. an Position(x,y). Wäre das ohne Threads realisierbar? Wohl eher nicht, oder?
Xin hat geschrieben:Schlussendlich wird es wohl auf Threads hinauslaufen. :)
Was genau sind Threads? Sind damit Prozesse gemeint, die innerhalb eines Programms laufen. Also ein oder mehrere Programme in einem Hauptrogramm?
Hat Thread-Programmierung auch was mit Multicore-Prozessoren zu tun? Können Programme die aus mehreren Threads bestehen auch auf einem Singlecore-Prozessor laufen?
Ich blicke da nicht so ganz durch. :?
Xin hat geschrieben:So schlecht ist der Thread hier doch gar nicht positioniert.
Sorry - ich wusste nicht genau ob ich hier richtig bin.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: ??? Echtzeituhr in einem Konsolenprogramm einbauen ???

Beitrag von Xin » Mo Mai 07, 2012 4:31 pm

3VAD_YNCAL hat geschrieben:Hallo Xin, du hast mir schon bei meinem letzten Thread super geholfen. Das Programm was ich ursprünglich geplant hatte ist fast fertig. Dank deiner Tipps bzgl. der ID's. :P Nochmals vielen vielen Dank dafür. Sobald es komplett fertig ist, würde ich dir gerne den gesamten Quellcode (sehr gut dokumentiert) schicken. Falls du Lust, Zeit und Interesse hättest es zu analysieren. Evtl. Verbesserungsvorschläge machen usw. Also nur wenn du willst, natürlich. :)
Kann ich nicht versprechen... nur versuchen. Kommt immer drauf an, wieviel gerade anliegt. Das schwankt teils sehr.
3VAD_YNCAL hat geschrieben:Das Programm wird, sowohl durch Funktionen des Betriebssystems als auch durch selbst geschriebene Funktionen zur Eingabe von Daten, angehalten.

Leider kann die Programmsteuerfunktion die Uhrzeit nicht regelmäßig updaten. Weil ich nicht weiß wie ich das umsetzen könnte. Ich hätte es gerne so, dass die Uhrzeit, unabhängig davon in welchem Menü man sich gerade befindet oder ob man gerade was eingeben muss (bspw. Namen, Passwort etc.), ständig mitläuft (inkl. Sekunden -> z.B. "16:43:45 Uhr"). Am besten sollte die Uhr an einer festen Position innerhalb des Programms verankert sein -> z.B. an Position(x,y). Wäre das ohne Threads realisierbar? Wohl eher nicht, oder?
Der Thread bringt die "Regelmäßigkeit" in die Sache.
Ansonsten ist alles ohne Threads machbar, aber dafür sind heutige Betriebsysteme immer selten ausgelegt.
Threads klingt hier also schon richtig.
3VAD_YNCAL hat geschrieben:
Xin hat geschrieben:Schlussendlich wird es wohl auf Threads hinauslaufen. :)
Was genau sind Threads? Sind damit Prozesse gemeint, die innerhalb eines Programms laufen. Also ein oder mehrere Programme in einem Hauptrogramm?
Hat Thread-Programmierung auch was mit Multicore-Prozessoren zu tun? Können Programme die aus mehreren Threads bestehen auch auf einem Singlecore-Prozessor laufen?
Ich blicke da nicht so ganz durch. :?
Auch ein Single-Core-Prozessor kann Threads bedienen. "Pseuso-Gleichzeitig". Jedes Programm läuft nur wenige Mikro- bis Millisekunden und dann ist das nächste Programm dran.
Unter Windows laufen ja auch mehrere Programme "pseudo-gleichzeitig", auch wenn Du nur einen Single-Core hast.

Ich würde mir aber gut überlegen, ob Du die Uhr wirklich brauchst. Ich halte Threads nicht unbedingt für notwendig, wenn man programmieren lernt.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Re: ??? Echtzeituhr in einem Konsolenprogramm einbauen ???

Beitrag von 3VAD_YNCAL » Di Mai 08, 2012 7:11 pm

Hallo Xin,
Xin hat geschrieben:Ich würde mir aber gut überlegen, ob Du die Uhr wirklich brauchst. Ich halte Threads nicht unbedingt für notwendig, wenn man programmieren lernt.
Du hast auf jeden Fall Recht. Allerdings macht es mir Spass herum zu experimentieren. Bzgl. der Uhr -> natürlich ist die Uhr völlig überflüssig im Programm, dass ich gerade schreibe.
Es geht mir aber weniger um die Uhr, sondern viel mehr darum wie man bspw. solch eine Uhr implementiert. Habe jetzt folgendes Test-Programm geschrieben. Leider ist das Ergebnis nicht
so wie ich es gerne hätte. Habe nun einen Thread für die Uhr erstellt. Das Problem ist aber, dass der Cursor logischerweise immer wieder an Pos( x, y ) springt um die aktualisierte Uhrzeit zu schreiben.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <time.h>
#include <pthread.h>
#include "conio/conio.h"

#define  clrscr()       printf("\033[2J")
#define  pos( x, y )    printf("\033[%d;%dH", x, y)

void *uhrzeit( void *val );
char *no_enterKey( char * );

void *uhrzeit( void *val )
{
    time_t      dat_clock;
    struct tm   *zeitInfo;
    char        puffer[80];

    while( 1 )
    {
        sleep( 1 );
        pos( 3, 4 );
        time( &dat_clock );
        zeitInfo = localtime( &dat_clock );

        strftime( puffer, 80, "\n\tUhrzeit: %X", zeitInfo );
        fputs( puffer, stdout );
    }
}

char *no_enterKey(char *str)
{
    int len;
    len = strlen(str);
    if(str[len-1] == '\n')
	     str[len-1] = '\0';

    return( str );
}

int main()
{
    pthread_t thread_1;
    int rc;
    char puffer[80];

    clrscr();

    rc = pthread_create( &thread_1, NULL, uhrzeit, NULL );

    if( rc != 0 )
    {
        printf("Thread_1 konnte nicht erzeugt werden!!!\n");
        return EXIT_FAILURE;
    }

    pos(  8, 1 );
    printf("Wie heisst du? ");
    pos(  9, 1 );
    fgets( puffer, 80, stdin );
    no_enterKey( puffer );
    pos( 12, 1 );
    printf("Hallo %s.", puffer);
    getch();

    pthread_cancel( thread_1 );
    pthread_join( thread_1, NULL );

    clrscr(); pos( 1, 1 );

    return EXIT_SUCCESS;
}
Gibt es eine Möglichkeit dieses Problem irgendwie zu umgehen? Das Problem ist ja, das man auf eine Konsole schreibt, aus der gerade gelesen wird. :?
Gruß Dave

Antworten