Получение системного времени из библиотеки хронографа - PullRequest
0 голосов
/ 12 апреля 2020

Я написал программу, которая использует командную строку Windows для отображения цифровых часов. Я использовал библиотеку Chrono для создания этих часов. Он предназначен для отслеживания каждой минуты системного времени, которое проходит с момента открытия программы, и затем увеличивает часы. Это делает все это вручную, и программа работает так, как я хочу (пока). Теперь, так как я отслеживал время вручную - мне также любопытно, можно ли использовать системное время напрямую, чтобы при открытии программы оно не запускалось во время, инициализированное вручную, а во сколько оно сейчас? is.

Таким образом, общий вопрос ... используя Chrono, как получить часы и минуты системного времени? Спасибо.

Код для справки ...

#include <iostream>
#include <chrono>
using namespace std;

#include <Windows.h>

int nScreenWidth = 240;
int nScreenHeight = 80;

int nMapWidth = 8;
int nMapHeight = 5;

int main()
{
    // Create Screen Buffer
    wchar_t* screen = new wchar_t[nScreenWidth * nScreenHeight];
    HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    SetConsoleActiveScreenBuffer(hConsole);
    DWORD dwBytesWritten = 0;

    // Current Time
    int hourDoubleDigit = 1;
    int hourSingleDigit = 2;
    int minuteDoubleDigit = 0;
    int minuteSingleDigit = 0;

    // Character Mapping
    wstring numberSystem[10] = {
    };

    numberSystem[0] += L"########"; numberSystem[1] += L"      ##"; numberSystem[2] += L"########";
    numberSystem[0] += L"##   ###"; numberSystem[1] += L"      ##"; numberSystem[2] += L"      ##";
    numberSystem[0] += L"## ## ##"; numberSystem[1] += L"      ##"; numberSystem[2] += L"########";
    numberSystem[0] += L"###   ##"; numberSystem[1] += L"      ##"; numberSystem[2] += L"##      ";
    numberSystem[0] += L"########"; numberSystem[1] += L"      ##"; numberSystem[2] += L"########";

    numberSystem[3] += L"########"; numberSystem[4] += L"##    ##"; numberSystem[5] += L"########";
    numberSystem[3] += L"      ##"; numberSystem[4] += L"##    ##"; numberSystem[5] += L"##      ";
    numberSystem[3] += L"########"; numberSystem[4] += L"########"; numberSystem[5] += L"########";
    numberSystem[3] += L"      ##"; numberSystem[4] += L"      ##"; numberSystem[5] += L"      ##";
    numberSystem[3] += L"########"; numberSystem[4] += L"      ##"; numberSystem[5] += L"########";

    numberSystem[6] += L"########"; numberSystem[7] += L"########"; numberSystem[8] += L"########"; numberSystem[9] += L"########";
    numberSystem[6] += L"##      "; numberSystem[7] += L"      ##"; numberSystem[8] += L"##    ##"; numberSystem[9] += L"##    ##";
    numberSystem[6] += L"########"; numberSystem[7] += L"      ##"; numberSystem[8] += L"########"; numberSystem[9] += L"########";
    numberSystem[6] += L"##    ##"; numberSystem[7] += L"      ##"; numberSystem[8] += L"##    ##"; numberSystem[9] += L"      ##";
    numberSystem[6] += L"########"; numberSystem[7] += L"      ##"; numberSystem[8] += L"########"; numberSystem[9] += L"########";

    // Keeping Track of System Time
    auto tp1 = chrono::system_clock::now();
    auto tp2 = chrono::system_clock::now();

    auto TickInterval = 60s;

    while (1)
    {
        for (int xy = 0; xy <= nScreenWidth * nScreenHeight; xy++) screen[xy] = ' ';//To prevent buggy character spawning...
        // You don't always have to write this above line if you're already making use of writing characters to every space in the screen, but I'm not!


        // Let the program know a minute has passed... (Time passes too much too often)
        tp2 = chrono::system_clock::now();
        chrono::duration<long double> delta__time = tp2 - tp1;
        bool TICKhasOCCURED = false;

        if (delta__time >= TickInterval)
        {
            tp1 += TickInterval;
            TICKhasOCCURED = true;
        }

        if (TICKhasOCCURED)
        {
            if (minuteSingleDigit >= 9)
            {
                if (minuteDoubleDigit >= 5)
                {

                    if (hourSingleDigit >= 9 && hourDoubleDigit == 0)
                    {
                        hourDoubleDigit++;
                        hourSingleDigit = 0;
                        minuteDoubleDigit = 0;
                        minuteSingleDigit = 0;
                    }
                    else if (hourSingleDigit >= 2 && hourDoubleDigit == 1)
                    {
                        hourDoubleDigit = 0;
                        hourSingleDigit = 1;
                        minuteDoubleDigit = 0;
                        minuteSingleDigit = 0;

                    }
                    else {
                        hourSingleDigit++;
                        minuteDoubleDigit = 0;
                        minuteSingleDigit = 0;
                    }//After 59 minutes check the hour and change it.
                }
                else {
                    minuteDoubleDigit++;
                    minuteSingleDigit = 0;
                }
            }
            else {
                minuteSingleDigit++;
            }
        }


        // The Current Time is then drawn out using the mapped characters.
        for(int ix = 0; ix < nMapWidth; ix++)
            for (int iy = 0; iy < nMapHeight; iy++)
            {
                screen[00 + ix + (nScreenWidth * iy)] = numberSystem[hourDoubleDigit][ix + (nMapWidth * iy)];
                screen[10 + ix + (nScreenWidth * iy)] = numberSystem[hourSingleDigit][ix + (nMapWidth * iy)];
                screen[20 + ix + (nScreenWidth * iy)] = numberSystem[minuteDoubleDigit][ix + (nMapWidth * iy)];
                screen[30 + ix + (nScreenWidth * iy)] = numberSystem[minuteSingleDigit][ix + (nMapWidth * iy)];
            }


        //Debug
        //cout << hourDoubleDigit << "\t" << hourSingleDigit << "\t" << minuteDoubleDigit << "\t" << minuteSingleDigit << endl;
        TICKhasOCCURED = false;

        screen[nScreenWidth * nScreenHeight-1] = '\0';
        WriteConsoleOutputCharacter(hConsole, screen, nScreenWidth * nScreenHeight, { 0,0 }, &dwBytesWritten);
    }

    return 0;
}

Изображение для справки ...

...