[C++] Immer aktuelle Uhrzeit ausgeben lassen

12/10/2014 14:36 .Quadral#1
Guten Tag liebe Coder,

heute zum zweiten mal ich :)

Ich habe ewig in der SuFu geschaut und nicht das gefunden was ich will, nun kommt mir die Frage ob es überhaupt möglich ist.

Ich möchte das in einer Konsolenanwendung die aktuelle Zeit da steht.
Ich möchte jedoch nicht das die Zeit da steht wenn ich Starte, sondern die Zeit soll ich immer automatisch jede Sekunde aktualisieren, wie eine normale Uhr eben.

Ist das möglich und wenn ja wie?

Mfg

€dit: Desweiteren möchte ich noch wissen, wie ich es machen kann das mir Ausgegeben wird das Programm schließt sich in 10 Sekunden und es zählt halt runter so das da 9, 8, 7, 6, 5, 4, 3, 2, 1 und programm schließt sich kommt.

Sorry für die möglichen Rechtschreibfehler.
12/10/2014 14:52 bloodx#2
Weis nicht ob's mittlerweile mit std::chrono oder ähnlichen andere Wege gibt ?
PHP Code:
time_t t;
struct tmts;

while(
true)
{
time(nullptr);
ts localtime(&t);
SetConsoleTitleA(asctime(ts));

12/10/2014 15:02 .Quadral#3
Bei dieser Art von Code, läuft es ganz oft durch, ich will ja das da die Zeit steht 15:03:12 z.B. und das aktualisiert sich jede Sekunde.

€dit: Und auch nur die Uhrzeit kein Datum Jahr Tag usw.

€dit2: So funktionierts einiger Maßen:
PHP Code:
#include <Windows.h>
#include <time.h>
#include <iostream>

int main()
{
    
time_t t;
    
struct tmts;

    while(
true)
    {
        
time(nullptr);
        
ts localtime(&t);
        
SetConsoleTitleA(asctime(ts));
        
Sleep(1000);
        
system("CLS");
    } 

    
getchar();
    return 
0;

€dit3: Ist es möglich das ich es so ausgebe: 'Tag-Monat-Jahr - Hour:Min:Sec' ?
12/10/2014 15:07 bloodx#4
du kannst über ts-> auf die einzelnen Werte zugreifen:

struct tm {
int tm_sec; /* Sekunden */
int tm_min; /* Minuten */
int tm_hour; /* Stunde (0 bis 23) */
int tm_mday; /* Tag im Monat (1 bis 31) */
int tm_mon; /* Monat (0 bis 11) */
int tm_year; /* Jahr (Kalenderjahr minus 1900) */
int tm_wday; /* Wochentag (0 bis 6, Sonntag = 0) */
int tm_yday; /* Tag im Jahr (0 bis 365) */
int tm_isdst; /* Ungleich null bei US-Sommerzeitkonvertierung */
};

ne schleife wirst du ja selber hinkriegen dass sie sich jede Sekunde Aktualisiert ?
12/10/2014 15:13 .Quadral#5
Das Problem ist ich will nicht nur Uhrzeit ausgeben sondern viel Text und die Uhrzeit soll da oben einfach stehen, deswegen ist mein system("CLS"); da sehr unpraktisch.
12/10/2014 15:19 bloodx#6
Du kannst nen Thread erstellen für dein Timer - std::thread

und den Text dann in einer anderen Funktion ausgeben lassen oder halt in main wie du möchtest.

Ja es ist möglich es auszugeben in einem anderen Format - sieh dir die Struct an dann siesht du ja welche Werte enthalten sind daraus bastelst du dir einen string.
12/10/2014 15:34 .Quadral#7
Okay danke!

Wenn ich das ganze jetzt in einer kleinen Windowsform machen möchte, wie kann ich da die Uhrzeit so zeigen?

Heißt in diesem Fenster steht nur die aktuelle Uhrzeit, mit dem aktuellen Code funktioniert das ja nicht.


€dit:
Wenn ich ts->tm_year sage, gibt er mit 114 aus..

Was tun??
12/10/2014 16:59 qqdev#8
Quote:
tm_year int years since 1900
[Only registered and activated users can see links. Click Here To Register...]
12/11/2014 01:52 +Yazzn#9
Quote:
Originally Posted by qqdev View Post
Quote:
int tm_year
years since 1900
[Only registered and activated users can see links. Click Here To Register...]
FTFY.
12/11/2014 09:02 XxharCs#10
Bitte bitte bitte kein system() verwenden. Es ist schlecht, unsicher und ressource fressend.
Schreibe dir lieber eine eigene Function die dein Konsolen Output leert.

So wie ich das sehe, setzt du die aktuelle Zeit als Titel der Konsolen Anwendung, wieso clearst du dann überhaupt?

Und ein Countdown der runter zählt ist auch einfach...
Code:
std::cout << "Das Programm beendet sich in 10 Sekunden" << std::endl;

for (int i = 10; i > 0; --i) {

	std::cout << i << std::endl;
}
Ich konnte dein Problem leicht mithilfe eines Observers lösen können. Sobald sich die Zeit ändert -> notify und der Text wird geändert. Wie effizient es gegenüber einem Thread es in diesem Fall ist, kann ich dir nicht sagen.
12/12/2014 15:19 .Lol#11
Eine eher unschöne single threaded Version.
PHP Code:
#include <chrono>
#include <iostream>
#include <iomanip>
#include <thread>

#ifdef _WIN32
    #include <windows.h>
#endif

...


// from: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682022%28v=vs.85%29.aspx
#ifdef _WIN32
void clearConsole()
{
    
auto hConsole GetStdHandle(STD_OUTPUT_HANDLE);

    
COORD coordScreen = { 0};    // home for the cursor 
    
DWORD cCharsWritten;
    
CONSOLE_SCREEN_BUFFER_INFO csbi;
    
DWORD dwConSize;

    
// Get the number of character cells in the current buffer. 

    
if (!GetConsoleScreenBufferInfo(hConsole, &csbi))
    {
        return;
    }

    
dwConSize csbi.dwSize.csbi.dwSize.Y;

    
// Fill the entire screen with blanks.

    
if (!FillConsoleOutputCharacter(hConsole,        // Handle to console screen buffer 
        
(TCHAR' ',     // Character to write to the buffer
        
dwConSize,       // Number of cells to write 
        
coordScreen,     // Coordinates of first cell 
        
&cCharsWritten))// Receive number of characters written
    
{
        return;
    }

    
// Get the current text attribute.

    
if (!GetConsoleScreenBufferInfo(hConsole, &csbi))
    {
        return;
    }

    
// Set the buffer's attributes accordingly.

    
if (!FillConsoleOutputAttribute(hConsole,         // Handle to console screen buffer 
        
csbi.wAttributes// Character attributes to use
        
dwConSize,        // Number of cells to set attribute 
        
coordScreen,      // Coordinates of first cell 
        
&cCharsWritten)) // Receive number of characters written
    
{
        return;
    }

    
// Put the cursor at its home coordinates.

    
SetConsoleCursorPosition(hConsolecoordScreen);
}
#else
void clearConsole() 
{
    
std::cout << "\x1B[2J\x1B[H";
}
#endif

int main(int argc_TCHARargv[])
{
    
using clock std::chrono::system_clock;


    while (
true) {
        
clearConsole();
        
auto timeNow clock::to_time_t(clock::now());
        
std::cout << "Aktuelle Uhrzeit: " << std::put_time(std::localtime(&timeNow), "%H:%M:%S");
 
        
// 1 Sekunde thread sleep führt zu Ungenauigkeiten (Bruchteile eine Sekunde)
        
std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    
    
    return 
0;

01/07/2015 01:37 hazejp#12
Code:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define SEC(x) ((x)*1000)

int main() {
time_t t;
struct tm* s;
for (;;) {
time(&t);
s = localtime(&t);
printf("%s\r",asctime(s));
Sleep(SEC(1));
}
}
01/07/2015 07:34 .Quadral#13
#closerequest
01/07/2015 12:08 snow#14
#closed