• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Anonym

[C++] Ajuda: Esperar um determinado tempo pelo Input (Resolvido)

16 mensagens neste tópico

Boas, então é assim. Eu tenho um prog, em que user deve inserir um valor, mas se ele demorar mais de x segundos o programa avança...

Eu tentei com o Sleep(8000) da lib windows.h , mas nao é bem isto, porque assim o programa para completamente.

uso dev-c++ e windows xp

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para completamente porque puseste para esperar 8000 segundos...

Entre os parêntesis tens que pôr o numero de segundos que queres parar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, o argumento do Sleep() é mili-segundos, logo 8000 seria 8 segundos. Mas o comando Sleep para completamento o programa não permitindo a obtensão de nenhum valor.

Vais percisar de usar uma biblioteca com timer, para poderes criar um loop que termine passado x tempo do timer. entro do loop não sei bem que função puderás usar, depende do que tu quiseres obter. Se for só uma tecla, usa as funções KeyPressed para verificares se alguma tecla foi pressionada e depois capturares essa tecla. Se quiseres mesmo obter valores maioresterás que usar outra função. De momento não estou a ver qual possa ser. Pode ser que alguém por aqui já tenha feito algo semelhante.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes fazer asim:

tempo_ inicial = time(NULL);

....

tempo_final = time(NULL);

diferença_de_tempo = tempo_final - tempo_inicial;

E assim sabes a diferença de segundos...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é o que eu quero é assim, eu fiz um prog que faz um output num ficheiro com a data e hora quando o windows inicia, e eu queria fazer com que apenas houvesse output se o pc reinicia-se sozinho.

Entao pensei por esta maneira...

essa do KeyPressed é se calhar ainda melhor, mas se tiverem sugestões, agradeço...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, o argumento do Sleep() é mili-segundos, logo 8000 seria 8 segundos. Mas o comando Sleep para completamento o programa não permitindo a obtensão de nenhum valor.

Olha que não é bem assim. Eu este ano tive de usar a função sleep() na programação em C de sockets e para esperar 3 segundos usava a instrução sleep(3)...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas em c++ com a lib windows.h é em Milisegundos

:P

Acredito... Eu sei pouco de C++ mas sempre ouvi dizer que se podia escrever C em C++...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A resposta complicada eu não a sei dar, era usar mais que um thread e isso ainda só arranhei uma vez e não deu em nada.

Uma ideia simples mas que pode ficar cara é por exemplo usar um loop que espere uns 100ms, verifique se há alguma tecla premida, caso haja sai do loop e lê o teclado, caso não haja decrementa uma variável, e se a variável chegar a zero continua o programa. Algo assim:

	for (int counter=80; counter > 0; --counter) {
	if (teclapressionada()) { //teclapressionada() e
		le_teclado();	//le_teclado() sao pura ficcao!
		break;
	}
	Sleep(100);		//80 ciclos do loop a multiplicar por 100ms... e fazer as contas 
}

Quanto à função Sleep() existente no windows.h (ou num dos seus headers), o seu parâmetro é efectivamente o número de milissegundos a esperar. Se a que usaste recebia o número de segundos, era uma implementação de outra pessoa...

P.S. : Está ali também a função SleepEx() para a tal solução complicada com multithreading... Se alguém quiser desenvolver eu fico agradecido :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrg... mas essa parte já eu tinha pensado + -

o que eu cria era mesmo a parte "le_teclado"

se alguem soubesse como ajudar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ninguem sabe mais alguma coisa?

no projecto do emulador de teclado braile.. talvez usou-se alguma coisa parecida..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei se percebi vem o que querias, mas pegando no exemplo do TheDark aqui vai:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h> //kbhit
#include <time.h> // sleep(long) 

void le_teclado();

int main(int argc, char *argv[])
{
  int counter = 0;
  fprintf(stdout, "press a key.");
  for (counter=80; counter > 0; --counter) {
        fprintf(stdout, ".");
	if ( kbhit() ) { //teclapressionada()
		le_teclado();	//le_teclado() sao pura ficcao!
		break;
	}
	sleep(100);		//80 ciclos do loop a multiplicar por 100ms... e fazer as contas 
}
  
  system("PAUSE");	
  return 0;
}

void le_teclado(){
     fprintf(stdout, "\na tecla foi pressionada");          
}

Experimentei o codigo no Linux, mas só depois é que me lembrei que o Linux não tem o kbhit() so mesmo o Windows, corre no DevC++.

Se não for isto que procuras tenta explicar-te melhor, fica bem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resolvido! Obrg. Agr outra duvida, alguem sabe como imprimir ficheiros? Imprimir um ficheiro já existente?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Imprimir para a LPT1 (impressora) ou para o (stdout) ecran?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O codigo que se segue está em C++.


#include <iostream>
#include <fstream>
#include <string>
#include <stdio> // definição 

using namespace std;

int main (void) {
  string line;
  ifstream infile  ("demo.txt");
  ofstream printer ( stdprn ); //stdprn é o handle para a impressora se 
                               // nao der experimenta colocar "lpt1" com as aspas
                               // é q p stdprn não está disponivel em alguns compiladores para Win32 so para Linux
                               // experimentei no DevC++ e no Borland C++ 5 ao q parece funca no Turbo C
  if (infile.is_open())
  {
    while ( !infile.eof() )
    {
      getline (infile,line); // ler uma linha do texto
      printer << line << endl; // enviar a linha para a impressora
    }
    infile.close(); // fechar o texto
    printer.flush();
    
  }
  else cout << "Unable to open file"; 
  
  system("pause");

  return 0;
}

Nota: Nos sistemas Win32 o handle stdprn (standard printer) não existe em alguns compiladores (assim como o stdaux), porque não sei, pelos vistos em alguns compiladores "lpt1" parece funcionar (vi o codigo na net), mas não consegui testar :D (sorry). (Lembro-me que o consegui fazer, mas já lá vão 6 anos)

PS: Caso essa dica não te ajude experimenta ver aqui: http://groups.google.com/group/microsoft.public.win32.programmer.gdi/browse_frm/thread/4635853df580dfa1/d2c52651856f1fda?lnk=st&rnum=5&hl=en#d2c52651856f1fda

um tipo afirma que consegui faze-lo usando API nativa para Win32, além do mais ele tem lá o codigo fonte.

Boa sorte.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora