Создание таймера обратного отсчета в C ++ - PullRequest
0 голосов
/ 03 января 2019

У меня есть консольное приложение, которое предназначено для запускается только на Windows . Это написано в C ++ . Есть ли способ подождать 60 секунд показать оставшееся время на экране), а затем продолжить поток кода?

Я пробовал разные решения из интернета, но ни одно из них не сработало. Либо они не работают, либо неправильно отображают время.

Ответы [ 4 ]

0 голосов
/ 03 января 2019

В C ++ вы можете использовать обратный отсчет.выполните следующую логику, которая позволит вам показать оставшееся время на экране.

for(int min=m;min>0;min--)  //here m is the total minits as per ur requirements
{
for(int sec=59;sec>=;sec--)
{
sleep(1);                   // here you can assign any value in sleep according to your requirements.
cout<<"\r"<<min<<"\t"<<sec;
}
}

, если вам нужна дополнительная помощь по этому вопросу, пожалуйста, перейдите по ссылке здесь

Надеюсь, это сработает, пожалуйста, дайте мне знать, что это работает в вашем случае или нет?или если вам нужна помощь.

Спасибо!

0 голосов
/ 03 января 2019

возможное использование Объекты ожидаемого таймера с периодом, установленным на 1 секунду, для этой задачи. возможная реализация

VOID CALLBACK TimerAPCProc(
                           __in_opt  LPVOID /*lpArgToCompletionRoutine*/,
                           __in      DWORD /*dwTimerLowValue*/,
                           __in      DWORD /*dwTimerHighValue*/
                           )
{
}

void CountDown(ULONG Seconds, COORD dwCursorPosition)
{
    if (HANDLE hTimer = CreateWaitableTimer(0, 0, 0))
    {
        static LARGE_INTEGER DueTime = { (ULONG)-1, -1};//just now
        ULONGLONG _t = GetTickCount64() + Seconds*1000, t;
        if (SetWaitableTimer(hTimer, &DueTime, 1000, TimerAPCProc, 0, FALSE))
        {
            HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
            do 
            {
                SleepEx(INFINITE, TRUE);
                t = GetTickCount64();
                if (t >= _t)
                {
                    break;
                }
                if (SetConsoleCursorPosition(hConsoleOutput, dwCursorPosition))
                {
                    WCHAR sz[8];
                    WriteConsoleW(hConsoleOutput, 
                        sz, swprintf(sz, L"%02u..", (ULONG)((_t - t)/1000)), 0, 0);
                }
            } while (TRUE);
        }
        CloseHandle(hTimer);
    }
}
    COORD dwCursorPosition = { };
    CountDown(60, dwCursorPosition);
0 голосов
/ 03 января 2019

Обратите внимание, что это специфичный для Windows код

//counter is the amount of seconds

int counter = 60;
_sleep(1000);
while (counter >= 1)
{
    cout << "\rTime remaining: " << setw(5) << counter << flush;
    _sleep(1000);
    counter--;
}
0 голосов
/ 03 января 2019

Вы можете использовать системный вызов sleep () для ожидания в течение 60 секунд.

Вы можете перейти по этой ссылке, чтобы установить таймер на 60 секунд с помощью системного вызова Таймер в C ++ с помощью системных вызовов .

...