Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dezt

[Resolvido] Função Sleep no Linux - Omitindo Cout ou Printf

Recommended Posts

Existia um tópico já falando sobre o Sleep no Linux, mas não bate com o assunto que irei citar aqui:

 

http://forum.imasters.com.br/topic/291347-funcao-sleep/page__p__1060672__hl__%2Bsleep+%2Blinux__fromsearch__1#entry1060672 (Tópico diferente, usei a busca e o Google).

 

OBS: Tópico criado por mim no fórum Codeblocks (esperando resposta lá também)

Link: http://forums.codeblocks.org/index.php/topic,14444.msg97115.html#msg97115

 

Olá pessoal.

 

Como sou iniciante na área de programação, não encontrei uma solução por conta própria para esse problema que estou tendo, já lí as regras do fórum, espero que meu tópico se encaixe nas mesmas.

 

Neste código (como pedem nas regras, cortei o código, mostrando só as prováveis partes onde ocorre o erro):

 

#include <iostream>
#include <unistd.h>

using namespace std;
;

   while (n>0) {
         cout << n << " ";
       sleep(3);
       --n;

             }

}

 

O que ocorre é o seguinte, no Windows, eu uso #include <windows.h> e o Sleep (com S maiúsculo), já no Linux, disseram em vários lugares para usar a <unistd.h>, beleza, o sleep em si, funciona, porém, ele não exibe uma contagem regressiva como no Windows, ele espera os 3 segundos e pimba, ele printa tudo de uma só vez, não importa se eu utilizo o printf (declaro stdio.h) ou o cout, ele ao invés de fazer como no Windows, que conta bonitinho, 3...2...1, ele printa tudo de uma vez, parecendo até que o programa travou.

 

Sei que isto não tem uma utilidade prática, é apenas estética, mas esta dúvida está me encafifando, procurei no Google inteiro por isto, mas não encontro alguém com o mesmo problema que eu.

 

OBS: Já tentei em 2 distros baseadas no Ubuntu, o Blackbuntu CE 0.2 (baseado no Ubuntu 10.10) e no Back Track Linux (não lembro em qual Ubuntu ele é baseado).

 

Desculpem se o meu tópico ficou inadequado, mas eu realmente gostaria de uma ajudinha, o restante do código está todo correto e tal, o programa não trava, só fica esquisita a contagem regressiva.

 

Abraços pessoal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No Linux também existe a contagem. Acontece que tanto no printf como no cout o buffer é orientado a linhas. Então, a não ser que você imprima um \n ou dê flush no stdout, não vai ser exibido nada antes do sleep.

Só parece que ele imprime tudo de uma vez porque quando o programa termina, todos os buffers sofrem flush.

Esse sim é um exemplo de local correto do uso da função fflush (ao contrário do fflush(stdin) que se vê por aí):

 

#include <stdio.h>
#include <unistd.h>
int main(void) {
  int n = 10;
  while (n) {
     printf("%d", n);
     fflush(stdout);
     n--;
  }
  return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

No Linux também existe a contagem. Acontece que tanto no printf como no cout o buffer é orientado a linhas. Então, a não ser que você imprima um \n ou dê flush no stdout, não vai ser exibido nada antes do sleep.

Só parece que ele imprime tudo de uma vez porque quando o programa termina, todos os buffers sofrem flush.

Esse sim é um exemplo de local correto do uso da função fflush (ao contrário do fflush(stdin) que se vê por aí):

 

#include <stdio.h>
#include <unistd.h>
int main(void) {
  int n = 10;
  while (n) {
     printf("%d", n);
     fflush(stdout);
     n--;
  }
  return 0;
}

 

Muito obrigado mesmo,foi uma resposta melhor da que eu obtive no fórum gringo do Codeblocks, perfeito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por curiosidade: o que eles te falaram?

 

Eles me falaram para colocar um endl, o que resultou em uma contagem, só que pulando linhas, aí perguntei como faria para fazer em seqüência, igual foi explicado aqui, o cara me disse que era algo em torno de std::cout.flush()., porém, ao compilar deu erro e o mesmo encerrou o tópico, tudo bem que a lógica também era correta, mas aqui foi explicado com muito mais clareza para um iniciante como eu.

 

Respota 1:

 

It is NOT an valid Code::Blocks post; but, you need to use endl and/or flush (not sure exact name) command with output if you wish it to have a close to real time effect.

 

Tim S.

 

Resposta 2:

 

std::cout.flush().

 

Consult a C++ documentation for further help. This topic is locked now as it is far beyond the scope of this forum.

 

Muito obrigado mesmo pessoal. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Na realidade o que eles falaram está certo para C++, e a instrução da tia Isis está certo para C. O problema é que os gringos não sabem explicar direito =P. Eles tem preguiça de explicar direitinho e então dão a referência do que olhar na documentação da C ou da C++, que são muito complicadas de entender. Você não sabe quanta dor de cabeça isso já me deu...

 

As instruções extras do cout são muito complicadas e muitas vezes iniciantes tem problemas com elas.

 

A _Isis_ explicou em C. Um exemplo em C++ seria:

 

#include <iostream>
using namespace std;

int main() {
  int n = 10;
  while (n) {
     cout << n;
     cout.flush();
     n--;
  }

  return 0;
}

 

PS: O stream.flush() ( no caso, cout.flush() ) da C++ seria equivalente ao fflush(stream) (no caso, fflush(stdout) ) da C.

 

Outra coisa que causa dúvida nas stream da C++ é que a instrução abaixo também é válida e equivalente ao exemplo que dei acima, causando ainda mais dúvidas (sobre qual usar).

 

#include <iostream>
using namespace std;

int main() {
  int n = 10;
  while (n) {
     cout << n << flush;
     n--;
  }
  return 0;
}

 

PS: O stream << flush ( no caso, cout << flush ) da C++ seria igualmente equivalente equivalente ao fflush(stdout) da C.

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Brother, você está de parabéns, sempre ajudando com explicações corretas e fáceis em sua compreensão, parabéns mesmo, deu certo também da maneira que você explicou. :)

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.