Помоги с функцией usleep в Линукс К ++

У меня есть функция, которая прерывает консоль из-за секунд и потом продолжает в следующую функцию:

void esperar(double segundos){
    if(segundos < 0) return;
    #ifdef _WIN32
        segundos *= 1000;
        int goal = (int) segundos + clock();
        while(goal > clock());
    #else
        segundos *= 1000000;
        int goal = (int) segundos;
        usleep(goal);
    #endif
}

Предполагая, что я хочу напечатать числа 1 в 10 с циклом for, я получаю два различных ответов завися, если есть разрыв линии или нет.

for(int i = 0; i < 10; ++i){
    cout << i + 1 << " ";
    esperar(0.1);
}

В первом цикле я оставляю место после каждого числа, но этот цикл ждет десятую часть секунды (0.1 * 1000000) из-за каждого cout в цикле, складывая общее количество 1 секунды. Только до тех пор, пока не заканчиваются 10 циклов 0.1 секунд печатается цепь.

1 2 3 4 5 6 7 8 9 10

Во втором цикле я оставляю разрыв линии между каждым числом.

for(int i = 0; i < 10; ++i){
    cout << i + 1 << endl;
    esperar(0.1);
}

Но у этого есть различное поведение (и желанный). Напечатав первый cout консоль ждет 0.1 секунд, чтобы печатать второй cout, надеется 0.1 секунд и печатает следующего....

1
//0.1 segundos
2
//0.1 segundos
3
//0.1 segundos
4
//0.1 segundos
5
//0.1 segundos
[...]

У меня есть следующие включенные книжные магазины

#include<time.h>
#include<unistd.h>

Существует способ это исправлять?

3
задан 13.01.2017, 10:47
0 ответов

В первой версии ты используешь как разделитель место:

for(int i = 0; i < 10; ++i){
    cout << i + 1 << " ";
    esperar(0.1);
}

То, за чем оно последует здесь, состоит в том, что ты накапливаешь в буфере вывода последовательность чисел. Что ты накопил их в буфере вывода, он не подразумевает, что они появились на экране. Буфер не является синхронным с консолью.

В данном моменте будет вынуждена синхронизация (потому что я закончил программу, осуществился призыв к методу ввода данных...) и тогда перевернется контент буфера в экран.

В этом случае я понимаю, что на экране они явятся результатами вслед за ожиданием 1 секунды (0.1 секунд ожидания из-за 10 чисел, которые будет нужно показывать).

Если мы сейчас видим второй случай:

for(int i = 0; i < 10; ++i){
    cout << i + 1 << endl;
    esperar(0.1);
}

Сейчас ты звонишь в endl. Хотя endl войди, как все знаем, разрыв линии, этот элемент обладает другой добавленной функциональностью и состоит в том, что вынуждает, которому буфер вывода был синхронным. Это вынуждает, что, введя в буфер это число, перевернули в консоль.

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

Я представляю, что то, к чему ты стремишься, состоит в том, чтобы исправлять первый случай. Чтобы вынуждать синхронизацию буфера вывода ты можешь использовать std::flush:

for(int i = 0; i < 10; ++i){
    cout << i + 1 << " " << std::flush;
    esperar(0.1);
}
3
ответ дан 03.12.2019, 17:41
  • 1
    Большое спасибо из-за ответа и explicació n. Это решает проблему верно. –  13.01.2017, 12:43