SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: difer1125 en Domingo 1 de Abril de 2007, 19:21

Título: Problema Con Simulacion De Un Reloj
Publicado por: difer1125 en Domingo 1 de Abril de 2007, 19:21
hola amigos el problema es que estay tratando de simular uen realidad un cronometro, pero es que tiene que tenar la opcion de iniciar, parar y salir cuando el usuario lo desee
y el problema es que no se para que realice los dos procesos a la vez, que ejecute los for del reloj y a la vez espere los datos para que el usuario decida cuando parara o reiniciar o salir de cronometro, por ahi eschuche que eso se hace con threads pero no se como. este es un ejemplo, aunque sencillo pero no es el que estoy construyendo pero trabaja igual


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int hora,min,seg; // Declarando as variáveis.
  int i;
  int u = 0;
  hora = 0, min = 0, seg = 0; // Inicializando variáveis.

  while (hora < 24)
  {
    while (min < 60)
    {          
      while (seg < 60)
      {    
        printf("\n%.2d:%.2d:%.2d",hora,min,seg);            
        for (i = 0; i <= 10000000; i++)                            
          u++;        
        seg = seg + 1;          
        system("clear");
      }
      seg = 0; // Resetando segundo.
      min = min + 1; // Incrementando minuto.      
    }
    min = 0;
    hora = hora + 1; // Incrementando hora.                
   
    /* Reseta hora para que o loop seja continuo */
    if (hora > 23)
    {
      hora = 0;
    }        
  }
  return(0);
}
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: su - en Domingo 1 de Abril de 2007, 19:30
Lo que necesitas es hacer un proceso hijo, la funcion fork (http://www.cs.cf.ac.uk/Dave/C/node22.html#SECTION002230000000000000000)
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Eternal Idol en Domingo 1 de Abril de 2007, 19:39
No necesariamente tiene que crear otro proceso sino que tambien puede usar hilos (threads) como el mismo menciono.

Si programas bajo Windows fork no existe pero si CreateThread:
http://msdn2.microsoft.com/en-us/library/ms682453.aspx (http://msdn2.microsoft.com/en-us/library/ms682453.aspx)
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: difer1125 en Lunes 2 de Abril de 2007, 01:54
amigos pero no tengo ni idea de como implementarla ya que nunca la he utilizado, me pueden dar un ejemplo
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Eternal Idol en Lunes 2 de Abril de 2007, 07:15
¿Leiste el enlace que te deje?

Example Code

For an example, see Creating Threads (http://msdn2.microsoft.com/en-us/library/ms682516.aspx).
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: su - en Lunes 2 de Abril de 2007, 23:10
Entonces, sabiendo que Windows tiene implementado el sistam POSIX :

podes ver este ejmplo y su documentacion. (http://en.wikipedia.org/wiki/POSIX_Threads)
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Eternal Idol en Lunes 2 de Abril de 2007, 23:21
Cita de: "su -"
Entonces, sabiendo que Windows tiene implementado el sistam POSIX :

podes ver este ejmplo y su documentacion. (http://en.wikipedia.org/wiki/POSIX_Threads)
Lo que dice ahi es que hay implementaciones para Windows y no que Windows implemente POSIX, en realidad este S.O. soporta un subconjunto muy reducido del standard POSIX y para hacer uso de esas funciones hay que generar ejecutables para el subsystem Posix que no permite acceder a la API de Windows asi como asi.
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: su - en Martes 3 de Abril de 2007, 01:23
Cita de: "Eternal Idol"
Cita de: "su -"
Entonces, sabiendo que Windows tiene implementado el sistam POSIX :

podes ver este ejmplo y su documentacion. (http://en.wikipedia.org/wiki/POSIX_Threads)
Lo que dice ahi es que hay implementaciones para Windows y no que Windows implemente POSIX, en realidad este S.O. soporta un subconjunto muy reducido del standard POSIX y para hacer uso de esas funciones hay que generar ejecutables para el subsystem Posix que no permite acceder a la API de Windows asi como asi.
 :D  Gracias por aclarar esto, pero entonces...
Esos subconjuntos son precticamente inutiles ?  :blink:
SI es asi, para que lo ponen en el S.O.?  :unsure:
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: JuanK en Martes 3 de Abril de 2007, 03:05
Cita de: "Eternal Idol"
Cita de: "su -"
Entonces, sabiendo que Windows tiene implementado el sistam POSIX :

podes ver este ejmplo y su documentacion. (http://en.wikipedia.org/wiki/POSIX_Threads)
Lo que dice ahi es que hay implementaciones para Windows y no que Windows implemente POSIX, en realidad este S.O. soporta un subconjunto muy reducido del standard POSIX y para hacer uso de esas funciones hay que generar ejecutables para el subsystem Posix que no permite acceder a la API de Windows asi como asi.
Debe de ser muy complicado hacer que interactuen... no lo dudo, pero no es necesario que interactuen.

puedes hacer aplicaciones posix y ejecutarlas en windows teniendo en cuenta:

http://support.microsoft.com/kb/q149902/ (http://support.microsoft.com/kb/q149902/)

•    Las aplicaciones con POSIX sólo inician otras aplicaciones POSIX. Ellos no pueden iniciar aplicaciones DOS, OS/2, Win16 o Win32.
•   Las aplicaciones con POSIX no pueden llamar a ningún API Win32. No tienen ningún acceso a DDE OLE, la memoria asignó archivos, canalización con nombre, socket de ventanas y otras características Win32.
•   Las aplicaciones con POSIX no pueden cargar un DLL para Win32 implícitamente o explícitamente.
•   Las aplicaciones con POSIX no tienen acceso a cualquier API de red como canalizaciones o socket. No forman red en cuenta pero pueden tener acceso a archivos a través de la red.
•   Las aplicaciones con POSIX no ofrecen ninguna compatibilidad de origen de depurador de nivel. No puede utilizar Windbg o el depurador de Microsoft Visual C++ para depurar aplicaciones POSIX en Windows NT.

Para poder ejecutar aplicaciones POSIX.1 se debe tener en la maquina los siguientes archivos:

Psxss.exe El server del subsistema posix
Posix.exe El administrodor de sesiones de la consola POSIX
Psxdll.dll  La libreria dinamica de POSIX

No viene por defecto en el sistema pero por ejemplo para windows 2000 se consiguen en el Windows 2000 Professional Resource Kit.

Mas información al respecto:

http://www.microsoft.com/technet/archive/n...p.mspx?mfr=true (http://www.microsoft.com/technet/archive/ntwrkstn/reskit/poscomp.mspx?mfr=true)

donde dice que hay una forma de comunicar las API una forma no muy limpia pero ahi esta:
Citar
Communicating with Other Subsystems

Windows NT supports a common command processor that can run commands from any subsystem. In addition, Windows NT supports piped input and output between commands of different subsystems. For example, you could run the ls utility and pipe the results through the more command to the console:
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: difer1125 en Martes 3 de Abril de 2007, 03:23
voy a tratar de implementarlo pero la verdad aun no me que muy claro, como funcionaria en mi ejemplo del cronometro
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Eternal Idol en Martes 3 de Abril de 2007, 08:18
Cita de: "su -"
:D  Gracias por aclarar esto, pero entonces...
Esos subconjuntos son precticamente inutiles ?  :blink:
SI es asi, para que lo ponen en el S.O.?  :unsure:
La realidad indica que es inutil y por eso se dejo de distribuir, esta es la alternativa:
http://en.wikipedia.org/wiki/Interix (http://en.wikipedia.org/wiki/Interix)
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Eternal Idol en Martes 3 de Abril de 2007, 09:08
Cita de: "JuanK"
Debe de ser muy complicado hacer que interactuen... no lo dudo, pero no es necesario que interactuen.
El punto es que hay muy pocas funciones y entonces resulta inutil sin usar la API de Windows por eso es preferible usar Interix o escribir nuestra propia libreria si realmente nos interesa.
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: JuanK en Martes 3 de Abril de 2007, 18:05
veo, usar entonces cygwin también sera posible al menos para lo básico.
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Karman en Jueves 5 de Abril de 2007, 17:47
saliendo del multithread y todo eso... la opción mas simple (para la complejidad de tu ejercicio) es mediante la función getc ()... la cual la insertás dentro del bucle y no detiene la ejecución del programa hasta que el usuario presione una tecla (la que vos quieras que sea para parar, continuar, terminar, etc), lo podrías implementar más o menos así:

Código: Text
  1.  
  2. for(;;;){
  3.  
  4.    //acá vendría la implementación del cronómetro...
  5.  
  6.    if(getc (stdin)=='&#092;n'){// el &#34;/n&#34; es la tecla enter
  7.       break;//salis del bucle...
  8.    }
  9.  
  10. }
  11.  
  12.  

S2
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Eternal Idol en Jueves 5 de Abril de 2007, 18:08
Cita de: "Karman"
saliendo del multithread y todo eso... la opción mas simple (para la complejidad de tu ejercicio) es mediante la función getc ()... la cual la insertás dentro del bucle y no detiene la ejecución del programa hasta que el usuario presione una tecla (la que vos quieras que sea para parar, continuar, terminar, etc), lo podrías implementar más o menos así
Si lo que decis fuera cierto esto al arrancar escribiria muchas veces abc:

Código: Text
  1.  
  2.   for(;;)
  3.   {
  4.     printf(&#34;abc&#092;r&#092;n&#34;);
  5.     if(getc (stdin)=='&#092;n'){
  6.        break;
  7.     }
  8.   }
  9.  
  10.  
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Karman en Jueves 5 de Abril de 2007, 18:15
tene razón... pero me parece que había una función standart para emular kbhit()... tendría que reveer mis códigos fuentes... je
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Eternal Idol en Jueves 5 de Abril de 2007, 18:18
Cita de: "Karman"
tene razón... pero me parece que había una función standart para emular kbhit()... tendría que reveer mis códigos fuentes... je
Que yo sepa no la hay, obviamente que se puede hacer usando los servicios del S.O. bajo el cual trabajemos.
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: difer1125 en Sábado 14 de Abril de 2007, 17:14
amigos pueden darme un ejemplo como podria utilizar la funcion kbhit() dentro de mi programa para cuando el usuario pulse d se detenga, cuando pulse i inicie, y cuando pulse r se reanude.
Título: Re: Problema Con Simulacion De Un Reloj
Publicado por: Karman en Sábado 14 de Abril de 2007, 20:50
Código: Text
  1.  
  2. char op=0;
  3.  
  4. for(;;;){  
  5.  
  6.    if(kbhit())
  7.       op=getch();
  8.  
  9.    if(op){
  10.    switch(op){
  11.       case 'd':
  12.          // se hace algo
  13.       break;
  14.       case 'i':
  15.          // se hace algo
  16.       break;
  17.       case 'r':
  18.          // se hace algo
  19.       break;
  20.       default:// no hacemos nada...
  21.       break;
  22.    }
  23.    op=0;
  24.    }
  25.  
  26.    //se ejecuta el código
  27. }
  28.  
  29.  
  30.  

S2