Terminar Loop Infinito [RESOLVIDO]

1. Terminar Loop Infinito [RESOLVIDO]

Carlos Eduardo
kadu_

(usa Ubuntu)

Enviado em 01/04/2010 - 22:04h

Olá galera,

Eu comecei a fazer um programa em cima de um loop infinito. Bem simples mesmo. Só que eu estava querendo que o programa continuasse rodando 'infinitamente' e sozinho e parasse quando eu apertasse uma tecla, por exemplo, o letra 'q'. Só que eu não estou conseguindo fazer isso. Tinha pensado no getch, mas nao deu certo.


Segue abaixo o programa,

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

FILE* filePtr;

void main(){

int i;
DWORD n;
int cont=0;
char nome_arquivo[20];

printf("\nEntre com um intervalo de tempo em milisegundos: ");
scanf_s("%d", &n);

for(i=1;;i++){
printf("\n\ni = %d", i);
sprintf_s( nome_arquivo, "Test%d.txt", i );
filePtr = fopen(nome_arquivo , "a" );
fprintf(filePtr, "%d" , i);
fclose(filePtr);
Sleep(n);

}

system("pause");

}


  


2. Re: Terminar Loop Infinito [RESOLVIDO]

Carlos Eduardo
kadu_

(usa Ubuntu)

Enviado em 01/04/2010 - 23:53h

Alguém?

Obrigado


3. Re: Terminar Loop Infinito [RESOLVIDO]

José Mário
miura 787

(usa Ubuntu)

Enviado em 02/04/2010 - 00:47h

Para que o programa leia alguma coisa do teclado ele tem que interromper o looping e aguardar o usuário digitar alguma coisa e dar o enter.

Para que ele fique em looping infinito e ao mesmo tempo aguarde alguem digitar alguma coisa para que interrompa o looping vc terá que escrever um programa que rode em 2 linhas de execução, isto é, thread.

uma linha de execução roda um looping enquanto uma variável for diferente de 1 por exemplo.

a 2a linha de execução aguarda o usuário dar enter e escreve 1 na mesma variável interrompendo o looping da linha de execução anterior.

Estude thread e poste o resultado.

Ats
Miura 787


4. Re: Terminar Loop Infinito [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 02/04/2010 - 08:37h

Bem, o thread pode ser a resposta correta, mas talvez seu problema seja mais simples que isso.

Pelo que entendi:

Rodar seu programa infinitamente e só parar quando apertar uma tecla?

Ao invés de uma tecla, você pode apertar duas: Ctrl+C, seu programa irá parar imediatamente.

Se é para o programa continuar a rodar, é só você programar um recebimento de sinais em seu programa que ele irá receber um sinal e fazer alguma ação desejada (recebe o sinal SIGHUP(?) do ctrl+c, faz alguma ação e depois volta a execução). Nunca testei, mas acho que dá certo. Se você está querendo algo como "Problema da Parada" é melhor esquecer :D

Outra: Para fazer o loop infinito, opte para algo como while(1), porque em seu for, você está icrementando um int infinitamente, e com certeza, lá na frente deve rolar estouro na capacidade do int.

Espero ter ajudado.
t+


5. Re: Terminar Loop Infinito [RESOLVIDO]

Carlos Eduardo
kadu_

(usa Ubuntu)

Enviado em 02/04/2010 - 23:10h

Eu vi as respostas e realmente não sabia a questao do Ctrl-C. Mas quando executei apareceu o seguinte erro:

"First-chance exception at 0x7c87556d in time2.exe: 0x40010005: Control-C."

Não entendi!!

A outra questão é que quando ele parasse ele voltasse ao programa, por exemplo se tivesse um menu.

Eu vou dar uma lida em thread. Não sabia disto.

Obrigado e mais ajudaa..




6. Re: Terminar Loop Infinito [RESOLVIDO]

Andi
upc0d3

(usa Gentoo)

Enviado em 03/04/2010 - 06:58h

Menu tu faz com o "switch";
eu vou escrever aqui um pedaco de codigo, acho que eh o que tu procura:

int main()
{
char ch;
while(1)
{
printf("Digite: ");
scanf("%c"&ch);

switch(ch){
case 'a': printf("A"); break;
case 'b': exit(1); break;
}
}
return 0;
}

Jah avisando, esse pedaco de codigo esta um LIXO, foi pura e simplesmente para demonstrar um menu e um loop infinito !

ateh+++


7. Re: Terminar Loop Infinito [RESOLVIDO]

Carlos Eduardo
kadu_

(usa Ubuntu)

Enviado em 03/04/2010 - 12:35h

Mas neste caso o programa vai ficar esperando eu digitar pra rodar ou sair, certo?

Eu vou explicar melhor...

Eu to fazendo a programação de uma camera, ccd. Então eu preciso que ela fique tirando fotos num certo intervalo de tempo automaticamente. Eu já fiz isso, só que eu preciso dar a quantidade de vezes. Eu precisava fazer um loop infinito, pra deixar ela tirar fotos de tanto em tantos minutos e quando eu quiser sair, eu apertaria uma tecla e ele ia voltar ao menu principal do programa.

Entenderam?

Obrigadooo.


8. Re: Terminar Loop Infinito [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 03/04/2010 - 13:46h

Em relação ao ctrl+c: Deve ter aperecido essa mensagem porque você rodou o seu executável através de uma IDE, por exemplo.
Se você for para o terminal puro (ou o prompt do DOS), digitar o nome do seu programa, e apertar ctrl+c, nenhuma mensagem irá aparecer.

Entretando, não sei como você irá simular um ctrl+c em sua câmera, acho que não será possível.

Para um programa em loop inifinito parar a execução, é necessário alguns agentes externos (envio de sinais via teclado, um programa fechando outro, etc) .. aí nesse caso, a programação concorrente (= threads) deverá te ajudar.

t+


9. Re: Terminar Loop Infinito [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 03/04/2010 - 14:06h

Tipo, fiz um programa aqui utilizando fork(). O fork irá duplicar o código do programa e criar dois processos. Um processo executa o primeiro if (aqui vem o seu loop infinito) e o segundo processo executa tudo que está no else.

Quando a tecla 'y' for pressionada, o processo pai irá mandar um SIGKILL para o filho e para ele mesmo, assim ambos os programas serão fechados.

#include <stdio.h>
#include <signal.h>

int main() {

int pid;

if ( fork() ) {
/* Codigo filho */
while(1) {
/* Seu loop infinito vem aqui */
sleep(1) ;
}
}
else {
/* Codigo do pai */
while ( 1 ) {
printf("Interromper programas? (y/n): ") ;
if ( getchar() == 'y' )
kill( 0 , SIGKILL ) ;
putchar('\n') ;
}
}

}

Teste aí.

Espero ter ajudado.
t+


10. Re: Terminar Loop Infinito [RESOLVIDO]

Carlos Eduardo
kadu_

(usa Ubuntu)

Enviado em 03/04/2010 - 18:12h

Entendi...

Como a programação da camera precisa ser pra Windows eu estou usando o Visual Studio 2008. Fui colocar para rodar esse exemplo só que ele nao reconheceu fork(), SIGKILL e kill. É só pra linux esses comandos? Eu não sei.

Obrigado.


11. Re: Terminar Loop Infinito [RESOLVIDO]

Carlos Eduardo
kadu_

(usa Ubuntu)

Enviado em 05/04/2010 - 20:23h

Só estou postando aqui dizendo que consegui resolver meu problema

Achei uma função

_kbhit()

Faz exatamente o que eu estava querendo.

Um abraço e obrigado pela ajuda...






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts