0
votes

Faire un compte à rebours en C ++

J'ai une application de console destinée à seule exécution sur Windows . Il est écrit dans C ++ . Y a-t-il un moyen d'attendre 60 secondes (et montrer le temps restant à l'écran), puis continuez le flux de code?

J'ai essayé différentes solutions sur Internet, mais aucun d'entre eux n'a travaillé. Soit ils ne fonctionnent pas, ni ils n'affichent pas correctement.


8 commentaires

A Pour boucle qui dort 1 seconde 60 fois?


Qu'est-ce que avez-vous essayé? Veuillez lire Les pages d'aide , prendre The So Tour , lisez à propos de Comment poser de bonnes questions , ainsi que Cette question de contrôle . Enfin, apprenez à créer un exemple de reproductible minimal .


Exactement. Mais je dois afficher le temps restant à l'écran et je ne peux pas comprendre comment faire cela. Je ne peux pas comprendre un moyen de ne pas effacer que des parties spécifiques de l'écran.


Que diriez-vous d'utiliser le retour du chariot pour écraser ce que vous avez précédemment écrit? Comme par exemple Std :: Cout << "\ Rtime restant:" << std :: setw (5) << Compteur << Std :: Flush;


@ H4ze Donc, votre question est réellement "Comment effacer une partie de la console", n'est-ce pas? Si vous recherchez cela, vous allez atterrir à Cette répond. Cela suppose que vous voulez dire la console avec "l'écran", cette partie n'est pas claire.


@SomeProgrammerDude Le commentaire est effectivement travaillé, mais je pense que le compte à rebours est plus rapide que 60 secondes. Comme les secondes réelles sont plus rapides. Voici mon code: compteur int = 60; tandis que (comptoir> = 1) {cout << "\ rtime restant:" << Setw (5) << Compteur << Flush; _sleep (1000); compteur--; }


Utiliser setwaitableTimer avec complététroutine et la période == 1 sec et SleepEx (Infinite, true); - Imprimer Temps Remaiting du rappel


Il n'est pas nécessaire d'utiliser du code spécifique à Windows si vous avez accès à un compilateur C ++ 11. Vous pouvez remplacer la fonction veille () avec std :: this_thread :: sleep_for () . Jetez un coup d'œil à Cette page .


5 Réponses :


0
votes

Vous pouvez utiliser l'appel du système de veille () pour dormir pendant 60 secondes.

Vous pouvez suivre ce lien pour définir une minuterie de 60 secondes à l'aide de l'appel système Minuterie en C ++ à l'aide des appels système .


1 commentaires

Je ne pense pas que tu avais compris ma question. Je veux un compte à rebours , pas une minuterie.



0
votes

Utilisation possible Objets de minuterie servable avec Perion défini sur 1 seconde pour cette tâche. Mise en œuvre possible

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 commentaires

1
votes
//Please note that this is Windows specific code
#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
    int counter = 60; //amount of seconds
    Sleep(1000);
    while (counter >= 1)
    {
        cout << "\rTime remaining: " << counter << flush;
        Sleep(1000);
        counter--;
    }
}

2 commentaires

Vous pouvez faire une plate-forme inter-plate-forme si vous utilisez std :: this_thread :: sleep_for .


Sans surprise, vous devez #include . Et c'est généralement une bonne pratique pour éviter le code spécifique à la plate-forme lorsque vous le pouvez. À l'heure actuelle, il n'a pas besoin de courir sur d'autres OSES, mais cela pourrait changer à l'avenir.



-1
votes

en C ++, vous pouvez utiliser le compte à rebours. Veuillez passer en revue avec la logique suivante qui vous permettra de montrer le temps restant à l'écran.

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 commentaires

0
votes

Cela pourrait être de certaines aide, ce n'est pas tout à fait clair quelle est la question, mais il s'agit d'un compte à rebours de 10 secondes, vous pouvez modifier les secondes et ajouter des minutes ainsi que des heures. xxx


0 commentaires