elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con hilos en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con hilos en C  (Leído 3,129 veces)
codX

Desconectado Desconectado

Mensajes: 65


Es más complejo de lo que crees...


Ver Perfil
Ayuda con hilos en C
« 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. }


En línea

fary


Desconectado Desconectado

Mensajes: 1.084



Ver Perfil WWW
Re: Ayuda con hilos en C
« Respuesta #1 en: 26 Enero 2020, 11:04 am »

Prueba a pausar el hilo principal, es decir, que no muera la función main.


En línea

Un byte a la izquierda.
codX

Desconectado Desconectado

Mensajes: 65


Es más complejo de lo que crees...


Ver Perfil
Re: Ayuda con hilos en C
« Respuesta #2 en: 14 Febrero 2020, 19:03 pm »

Fary, gracias por tu tiempo. Lo probaré
En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Ayuda con hilos en C
« Respuesta #3 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().
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Sockets y Hilos ?? !!! AYUDA
Programación C/C++
<<<-Basura->>> 7 6,564 Último mensaje 11 Diciembre 2011, 09:42 am
por <<<-Basura->>>
ayuda con hilos
Java
luisdoros 0 1,246 Último mensaje 14 Julio 2012, 16:56 pm
por luisdoros
ayuda con hilos
Java
luisdoros 1 5,530 Último mensaje 17 Julio 2012, 02:21 am
por leogtz
[Ayuda] Hilos - basico
Programación C/C++
bemone 4 2,560 Último mensaje 20 Junio 2013, 20:55 pm
por bemone
Ayuda con hilos en C « 1 2 »
Programación C/C++
snake_linux 14 5,890 Último mensaje 28 Agosto 2015, 00:06 am
por snake_linux
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines