Nick_is_asking Ответов: 3

Строка языка C "загрузка"


Всем привет...
У меня есть программа, выполняющая свою работу
Я хочу немного подождать,чтобы что-то сделать(не заботясь об этом), и в то же время я хочу напечатать что-то с задержкой, но это не работает так, как я ожидал.

Код(его часть):

Что я уже пробовал:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>


void delay(int number_of_seconds) ;
void Loading();

int main(void)
{
    Loading();
}


void delay(int number_of_seconds) 
{ 
    // Converting time into milli_seconds 
    int milli_seconds = 1000 * number_of_seconds; 
  
    // Storing start time 
    clock_t start_time = clock(); 
  
    // looping till required time is not achieved 
    while (clock() < start_time + milli_seconds); 
} 

void Loading()
{
    char *array[4] = {"/" , "--" , "\\" , "|"};
    
    for(int j = 1; j <= 8; j++)
    {
        for(int i = 0; i <= 3; i++)
        {
            printf("%s" , array[i]);
            delay(100);
            printf("\b");
            printf(" ");
            delay(100);
            printf("\b");
        }
    }
}

Я хочу напечатать "/" и после задержки 0,1 сек. напечатать следующую строку массива в той же позиции(для этого я использую обратную косую черту + b).
Проблема в том, что на выходе через несколько секунд я получаю вот это: "--------"
Спасибо!!!

3 Ответов

Рейтинг:
22

CPallini

Это работает (по крайней мере, на моем Linux-боксе), если вы смываете стандарт:

void Loading()
{
    char *array[4] = {"/" , "--" , "\\" , "|"};

    for(int j = 1; j <= 8; j++)
    {
        for(int i = 0; i <= 3; i++)
        {
            printf("%s" , array[i]);
            fflush(stdout); //<---
            delay(100);
            printf("\b");
            printf(" ");
            fflush(stdout); //<---
            delay(100);
            printf("\b");
        }
    }
}


Nick_is_asking

Спасибо.Это прекрасно работает...

CPallini

Добро пожаловать.

Richard MacCutchan

+5; я совсем забыл об этом.

CPallini

Потому что теперь вы привыкли к этим причудливым кричащим скриптовым языкам... :-D
Большое тебе спасибо, Ричард.

Richard MacCutchan

А еще потому, что слово "смыть" вызывает у меня в мозгу совсем другую ассоциацию. :)

Рейтинг:
12

KarstenK

Это не очень хорошая идея, потому что ваше время имеет некоторую рабочую нагрузку и использует энергию и процессорное время. Лучше использовать какую-то специфическую для ОС функцию ожидания, например спать() или nanosleep().


Rick York

Я не могу не согласиться. Спиновые петли без ожидания редко бывают хорошей идеей.

Рейтинг:
1

Richard MacCutchan

Проблема заключается в том, что операторы печати отправляют некоторые данные в выходной поток. Затем код немедленно попадает в цикл задержки, который предотвращает выполнение любых операций вывода, поэтому они выстраиваются в очередь и печатаются только в более позднее время. Вы можете управлять вещами в приложении Windows с помощью фоновой обработки и таймеров, но консольные приложения не могут легко использовать эти функции.

[редактировать]
У Карло, как всегда, есть ответ.
[/редактировать]