C/Visual C - procesos en c linux

 
Vista:
sin imagen de perfil
Val: 20
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

procesos en c linux

Publicado por script_code (7 intervenciones) el 10/05/2019 03:47:22
Hola, soy nuevo en el foro. Estoy creando un pequeño juego en c con ncurses. Su estructura es como sigue

1
2
3
4
5
6
7
main
crea un proceso
   /* codigo del proceso hijo */
sino
   /* codigo del proceso padre */
 
fin del main

el problema que estoy teniendo es que el proceso hijo es un cronometro, pero al lanzarlo no se ejecuta correctamente. aparecen letras dentro de la ventana del cronometro
También he probado ejecutar el proceso padre en dos hilos: un hilo para la parte principal del juego y otro para el cronometro, pero es peor, ya que los numeros se dispersan por toda la ventana del juego principal. Agradecería algún aporte.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de SuperIndio

procesos en c linux

Publicado por SuperIndio (21 intervenciones) el 10/05/2019 18:10:53
No man por lo que veo estas usando fork(),
te convendria usar 2 programas distintos y correrlo por 2 consolas distintas
pero unirlo por memoria compartida
o mutiproceso con Threads
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 20
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

procesos en c linux

Publicado por script_code (7 intervenciones) el 10/05/2019 18:23:09
Hola. Gracias por tu tiempo. Sí estoy usando fork(). Como podria correrlo por dos consolas distintas ya que, el cronometro debe verse en la pantalla donde estás jugando? He probado correr dos hilos con threads pero algo anda mal. Fijate, con threads lo hice asi


1
2
3
4
5
6
7
8
9
main
 
proceso hijo
        musica de fondo
proceso padre
       1er thread
             cronometro
        2do thread
             resto del juego

Desde ya muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

procesos en c linux

Publicado por Tom (599 intervenciones) el 10/05/2019 18:22:43
Me parece que con los datos que das ... habría que ser vidente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 20
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

procesos en c linux

Publicado por script_code (7 intervenciones) el 10/05/2019 18:28:38
es verdad pero no me da para postear 800 lineas de codigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

procesos en c linux

Publicado por Tom (599 intervenciones) el 10/05/2019 19:14:38
Pero vamos a ver. ¿ Los dos procesos usan curses y en el mismo terminal ? ¿ o el proceso del cronómetro ees el que usa curses ?
No puedes, en resumen. Solo un proceso, o hilo, casi da igual, debe estar escribiento en la consola.
En todo caso, haz fork() _antes_ de inicializar curses, y luego inicializa en ambos, a ver si así consigues algo.
O bien usa hilos, como te han comentado, y sincronízalos de forma que no se solapen las oepraciones de escritura.
O, mejor aún, haz un único proceso de forma que sea capaz de actualizar el cronómetro (con un timer o algo así).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 20
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

procesos en c linux

Publicado por script_code (7 intervenciones) el 10/05/2019 19:20:53
Gracias Tom. Sí los dos proceso usan ncurses y salen en la misma consola. Creo que ahí viene el problema. En un principio un proceso era el que se encargaba solo del cronometro. Me temo que están compartiendo el mismo espacio de memoria y eso es lo que tenga que solucionar. Muchas gracias por tu tiempo y tu aporte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

procesos en c linux

Publicado por Tom (599 intervenciones) el 10/05/2019 19:36:08
No, los dos procesos no comparten el espacio de memoria. En el momento que haces fork() el "hijo" tiene una copia de la memoria del "padre", pero no la misma.
En tu caso tienes dos opciones, a mi entender:

1.- No hagas subprocesos ni uses hilos y usa select() o poll() que es más sencillo incluyendo, por ejemplo, un timerfd para actualizar el cronómetro.
Tienes algo que te puede servir de introducción aquí: http://keyvanfatehi.com/2011/08/02/Asynchronous-c-programs-an-event-loop-and-ncurses/


2.- Asegurarte de que ncurses está compilada con esta opción (o recompila tú) y prueba y prueba y prueba:

--with-pthread
Link with POSIX threads, set --enable-reentrant. The use_window() and
use_screen() functions will use mutex's, allowing rudimentary support
for multithreaded applications.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 20
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

procesos en c linux

Publicado por script_code (7 intervenciones) el 10/05/2019 20:55:16
Entiendo que los procesos no comparten memoria y sí lo hacen los threads, por eso estoy desconcertado. Obviamente algo en mi código anda mal. Gracias por la info. No había visto esta documentación, la del link que me pasaste
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

procesos en c linux

Publicado por lolololo (1 intervención) el 18/06/2019 18:45:07
No pierdas el tiempo jugando con ncurses usando hilos o Fork, ncurses, no está diseñado para lo que pretendes.

Se puede hacer alguna cosa que simule programación paralela saliendo de la función mientras se espera una pulsación de teclado, una "chapuza".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar