Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: codX en 24 Enero 2020, 00:37 am



Título: Ayuda con hilos en C
Publicado por: codX en 24 Enero 2020, 00:37 am
Hola gente del foro, tengo un pequeño código que no puedo hacer funcionar. consta de un cronometro y musica, los cuales quiero ejecutar a la vez en dos hilos separados. Pero me pasa que, funciona simepre uno solo el thread de la musica, o el del cronometro. Alguien me puede ayudar por favor?
Este es el codigo, con libreria ncurses.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <ncurses.h>
  5. #include <pthread.h>
  6. void ini_video();
  7. void *cronometro(void *args);
  8. void *musica(void *arg);
  9. void ejecuta_threads();
  10.  
  11. int main()
  12. {
  13. ini_video();
  14. ejecuta_threads();
  15. return 0;
  16. }
  17.  
  18. void ejecuta_threads()
  19. {
  20. pthread_t th0, th1;
  21.  
  22. pthread_create(&th0, NULL, (void *)&cronometro, NULL);
  23. pthread_create(&th1, NULL, (void *)&musica, NULL);
  24. pthread_join(th0, NULL);
  25. pthread_join(th1, NULL);
  26. }
  27.  
  28. void ini_video()
  29. {
  30. int filas,columnas;
  31. initscr();
  32. start_color();
  33.  
  34. // letras, fondo.
  35. init_pair(1, 4, 2); // cronometro
  36. init_pair(2, 0, 2); // fondo pantalla
  37. cbreak();
  38. noecho();
  39. keypad(stdscr, true);
  40. bkgd(COLOR_PAIR(2));
  41. curs_set(0);
  42. getmaxyx(stdscr, filas, columnas);
  43. refresh();
  44. }
  45.  
  46. void *cronometro(void *args)
  47. {
  48. int horas, minutos, segundos;
  49.  
  50. for(horas = 0; horas <= 2; horas++){
  51. for(minutos = 0; minutos < 60; minutos++){
  52. for(segundos = 0; segundos < 60; segundos++){
  53. attron(A_BOLD | COLOR_PAIR(1));
  54. mvprintw(5, 50, "%s %i:%i:%i", "Tiempo ->  ", horas, minutos, segundos);
  55. napms(1000);
  56. refresh();
  57. }
  58. }
  59. attroff(A_BOLD | COLOR_PAIR(1));
  60. }
  61. return NULL;
  62. }
  63.  
  64. void *musica(void *arg)
  65. {
  66. char *comando = "/usr/bin/play";
  67. char *args[] = {"play", "-q", "donkey.ogg", "-t", "alsa", 0};
  68.  
  69. while(1)
  70. execv(comando, args);
  71.  
  72. }


Título: Re: Ayuda con hilos en C
Publicado por: fary en 26 Enero 2020, 11:04 am
Prueba a pausar el hilo principal, es decir, que no muera la función main.


Título: Re: Ayuda con hilos en C
Publicado por: codX en 14 Febrero 2020, 19:03 pm
Fary, gracias por tu tiempo. Lo probaré


Título: Re: Ayuda con hilos en C
Publicado por: RayR en 15 Febrero 2020, 18:40 pm
El problema es que execv(), como todas las funciones exec, crea un nuevo proceso que reemplaza al actual. Naturalmente, esto significa que cuando ejecutas execv(), el proceso original, con todos sus hilos, es finalizado, y lo único que queda ejecutándose es el comando.

Podrías crear un subproceso hijo (fork()), o bien, reemplazar el execv() por system(), pero el problema de fondo es estar invocando programas externos. Cualquier solución va a ser sucia y no óptima. Siempre es mucho mejor usar desde tu código alguna biblioteca para eso.

Si forzosamente quieres hacerlo con comandos, seguramente lo más sencillo sea que simplemente uses system() en lugar de execv(). En ese caso, deberías eliminar el while, o te será imposible cerrar el programa, a menos que mates el proceso. Fíjate si play acepta algún argumento para repetir indefinidamente el sonido, o escribe tú un script que lo haga, e invócalo desde system().