Cree un programa de cronómetro digital en C que se ejecute en el sistema base Linux. La función keyboardhit() simplemente significa golpe de teclado. Después de presionar una tecla, genera una señal y devuelve un número entero distinto de cero. En esto, hay 4 bucles, el 1er bucle para las horas, el 2º para los minutos, el 3º para los segundos y el 4º bucle para mantener la velocidad de los segundos (3 bucles). Después de ejecutar este programa, espera a que se presione una tecla de inicio del teclado y, cuando se presiona la tecla, genera una señal. Para almacenar una tecla del teclado, hay una variable (c), si c es igual a la tecla p, entonces llama a la función de espera. El subproceso se ejecuta en segundo plano y estamos esperando que se presione la tecla de inicio. Después de presionar la tecla s, el hilo vuelve a saltar a la función thread_join, si la tecla rse presiona, luego salta a la etiqueta de reinicio y todos los bucles comienzan nuevamente con ceros, si se presiona la tecla s , salta a la etiqueta de inicio y si se presiona la tecla e , llama a la función exit() y el programa finaliza. Requisito previo: subprocesos en c , llamada al sistema de espera
To execute the program we use following command :
Input: Press a key : s -> start e -> exit r -> reset p -> pause Output :
C
// C code to create stop watch // Header file for necessary system library #include <fcntl.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <termios.h> #include <unistd.h> // starting from zero #define MIN 0 // 1 hr= 60 min ; 1 min= 60 sec #define MAX 60 #define MILLI 200000 int i, j, k, n, s; char c; pthread_t t1; // Function to perform operations // according keyboard hit. int keyboardhit(void) { struct termios oldt, newt; int ch; int oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if (ch != EOF) { ungetc(ch, stdin); return 1; } return 0; } // display stopwatch on screen void print() { // clear screen escape sequence printf("\033[2J\033[1;1H"); // Display Hour Min Sec in screen printf("TIME\t\t\t\tHr: %d Min: %d Sec: %d", n, i, j); } // function to pause stopwatch void* wait(void* arg) { while (1) { // wait for keyboard signal if keyboard // hit it return non integer number if (keyboardhit()) { // take input from user and do // operation accordingly c = getchar(); if (c == 'S' || c == 's') { break; } else if (c == 'r' || c == 'R') { s = 1; break; } else if (c == 'e' || c == 'E') exit(0); } } } // driver code int main() { // label to reset the value reset: n = MIN; i = MIN; j = MIN; k = MIN, s = MIN; print(); while (1) { /* s for start e for exit p for pause r for reset */ if (keyboardhit()) { c = getchar(); if (c != 's') continue; for (n = MIN; n < MAX; n++) { for (i = MIN; i < MAX; i++) { for (j = MIN; j < MAX; j++) { for (k = MIN; k < MILLI; k++) { start: print(); if (keyboardhit()) { c = getchar(); if (c == 'r' || c == 'R') goto reset; else if (c == 'e' || c == 'E') exit(0); else if (c == 's' || c == 'S') goto start; else if (c == 'P' || c == 'p') { pthread_create(&t1, NULL, &wait, NULL); // waiting for join a thread pthread_join(t1, NULL); if (s == 1) goto reset; } } } } } } } } return 0; }
Producción:
Publicación traducida automáticamente
Artículo escrito por Kishor Mishra y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA