Jump to content

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


Recommended Posts

Posted

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

Posted

Para completamente porque puseste para esperar 8000 segundos...

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

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Posted

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.

Posted

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...

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Posted

é 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...

Posted

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)...

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Posted

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

😛

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

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Posted

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 😄

Desaparecido.

Posted

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.

Posted

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 😄 (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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.