Cronometro

1. Cronometro

victor augusto barros
vicevil

(usa Outra)

Enviado em 19/11/2013 - 19:38h

Olá

Estou fazendo um programa de questões no codeblocks, mas quando executo o programa o cronometro é executado primeiro. Estou querendo saber como é possível colocar o cronometro para executar enquanto o usuário tenta responder uma questão.

Espero pela ajuda !


  


2. Re: Cronometro

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/11/2013 - 23:04h

A forma tradicional é usar um timer do sistema operacional (no mundo UNIX, com timer_create()/timer_settime(), setitimer() ou alarm(); o Windows certamente tem seus equivalentes, mas eu não conheço porque não costumo programar com Windows), de modo a periodicamente enviar um sinal assíncrono para o processo que o faça executar um bloco de código associado ao tratamento desse sinal. O código abaixo é um exemplo (ruim e tosco, aliás, para não ocupar muito espaço aqui -- seria melhor usar sigaction() em lugar de signal(), bem como setitimer() ou ou timer_settime() em lugar de alarm(), mas deixaria o exemplo mais extenso).

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

void trata_alarme(int num_sinal){
static int decorridos;
printf("\nPassaram-se %d segundos e você ainda não apertou <ENTER>... ", ++decorridos);
fflush(stdout);
signal(SIGALRM, trata_alarme); /* reassocia o tratador do signal (desnecessário se sigaction() tivesse sido usada em main()) */
alarm(1); /* reinicia o timer de alarme (desnecessário se setitimer() ou time_settime() fosse usada em main()) */
}

int main(void){
printf("Espere alguns segundos e tecle <ENTER>: ");
signal(SIGALRM, trata_alarme); /* indica o tratador do sinal de alarme */
alarm(1); /* alarma em 1 segundo */
scanf("%*[^\n]%*1[\n]");
alarm(0); /* desliga o timer */
return 0;
}



Outra forma de fazer é ter threads de execução separadas para a a aplicação do questionário e para a contagem do tempo. Segue outro exemplo terrivelmente tosco (compile com "gcc prog.c -lpthread").

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void *cronometro(void *dados){
int decorridos=0;
while(1){
sleep(1);
printf("\nPassaram-se %d segundos e a thread ainda não foi cancelada. Tecle <ENTER>. ", ++decorridos);
fflush(stdout);
}
return NULL;
}

int main(void){
pthread_t thr_id;
int errno;
printf("Espere alguns segundos e tecle <ENTER>: ");
if((errno=pthread_create(&thr_id, NULL, cronometro, NULL))!=0){
fprintf(stderr, "\nErro %d na criacao da thread. Abortando.\n", errno);
return 1;
}
scanf("%*[^\n]%*1[\n]");
pthread_cancel(thr_id);
return 0;
}



Pessoalmente, entre os dois jeitos, eu prefiro o primeiro. Threads são principalmente para permitir a computação simultânea; eu acho um desperdício criar uma thread que vai ficar praticamente todo o tempo apenas parada, sem fazer coisa alguma (função sleep(), que aliás é "parente" da função alarm() do primeiro exemplo).






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts