Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda con la creacion de procesos y threads (win32)

Estas en el tema de Ayuda con la creacion de procesos y threads (win32) en el foro de C/C++ en Foros del Web. Necesito ayuda porque no tengo ni idea de lo que tengo que hacer, soy un programador mas malo que el pan y me han mandado ...
  #1 (permalink)  
Antiguo 28/05/2009, 11:14
 
Fecha de Ingreso: mayo-2009
Mensajes: 3
Antigüedad: 15 años
Puntos: 0
Ayuda con la creacion de procesos y threads (win32)

Necesito ayuda porque no tengo ni idea de lo que tengo que hacer, soy un programador mas malo que el pan y me han mandado hacer una cosa que me desborda por completo. Son 5 ejercicios de los cuales tengo terminado el primero y me funciona bien, mis problemas surgen en los 4 otros:

LOS ENUNCIADOS SON:
Código:
1. Diseñar una aplicación informática orientada a mostrar el funcionamiento
de los threads (hilos o procesos ligeros)
La aplicación será de tipo consola
Se diseñará una función “rutina” que utilice variables globales del
proceso
Se podrán lanzar como threads diferentes copias de la función
“rutina”
Se podrán parar todos los threads o individualmente cada uno
Se podrá suspender y reactivar cada thread
Se podrá ordenar la finalización de los threads y el proceso padre
esperará la finalización de cada thread

2. Diseñar una modificación de aplicación informática anterior orientada a
mostrar el funcionamiento de los procesos
Se diseñará un proceso denominado “DOS” que muestre el valor de
un sensor. La medida del sensor se simulará generando un valor de
forma aleatoria.
Se podrán lanzar, como procesos, diferentes copias del proceso
“DOS”
Se podrán parar todos los procesos o individualmente cada uno
Se podrá suspender y reactivar cada proceso
Se podrá ordenar la finalización de los procesos activados y el
proceso padre esperará la finalización de cada uno de ellos

3. Diseñar una modificación de la aplicación anterior en la que el proceso
DOS comparte, con exclusión mutua, el acceso memoria con el proceso
principal.

4. Diseñar una modificación de la aplicación anterior en la que el proceso
principal y el proceso DOS intercambian mensajes mediante “sockets” de
tipo TCP.
La reconexión será automática
El mensaje llevará una cabecera de control de secuencia.
Tanto el proceso principal como el proceso “DOS” podrán actuar
como servidores o como clientes.
La aplicación mostrará el uso de timers, watchdog y timeouts.

5. Diseñar una modificación de la aplicación anterior en la que el proceso
principal mostrará los datos significativos del proceso “DOS” PID,
identificador, uso de memoria, prioridad, etc.) pudiendo cambiar algunos
de ellos.
MI PROGRAMA PARA LA PRIMERA PARTE ES:

Código c:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <process.h>
  4. #include <windows.h>
  5.  
  6. HANDLE hConsoleOutput;
  7. HANDLE pPID[128];
  8.  
  9.    
  10. // Variables Globales
  11.  
  12. int Contador=0;
  13. int NUMERO=0;
  14. int FIN_THREAD=0;
  15.  
  16.  
  17. // FUNCIONES PARA LOS THREADS
  18.  
  19. // FUNCION QUE HARAN TODOS LOS THREADS
  20. void Rutina(void *p)
  21. {
  22. //  char Linea[100000];  // Esta declaración sólo sirve para ver el consumo de memoria
  23.     int Orden;
  24.     Orden=Contador;
  25.     COORD xy;           // COORD me dice dónde se escribirá toda la info de los Threads
  26.     xy.X=0;             // Coordenadas en el eje X
  27.     xy.Y=16+Orden;      // Coordenadas en el eje Y
  28.  
  29.     while (!FIN_THREAD)
  30.     {
  31.         SetConsoleCursorPosition(hConsoleOutput,xy );
  32.         printf(" Rutina [%d] dice que %d\n",Orden,NUMERO);
  33.         Sleep(1000);
  34.         NUMERO++;
  35.     }
  36.  
  37.     SetConsoleCursorPosition(hConsoleOutput,xy );
  38.     printf("                                            ");
  39.     _endthread();
  40. }
  41.  
  42.  
  43. // FUNCION PARA LANZAR UN THREAD
  44.  
  45. void Lanzar()
  46. {
  47.     FIN_THREAD = 0;
  48.     NUMERO=0;
  49.     Contador++;
  50.     pPID[Contador]=(HANDLE)_beginthread(Rutina, 0, NULL);
  51. }
  52.  
  53.  
  54. // FUNCION PARA SUSPENDER UN THREAD
  55.  
  56. void Suspender()
  57. {
  58.     char n;
  59.     int Orden;
  60.     Orden=Contador;
  61.     COORD ij;
  62.     ij.X=0;            
  63.     ij.Y=14;
  64.     SetConsoleCursorPosition(hConsoleOutput,ij);
  65.     printf("Thread que quieres Suspender?                              ");
  66.     n=getch();
  67.     SuspendThread(pPID[n-'0']);
  68.     Sleep(1);
  69.     SetConsoleCursorPosition(hConsoleOutput,ij);
  70.     printf("                              Has Suspendido la Rutina [%d]",n-'0');
  71. }
  72.  
  73.  
  74. // FUNCION PARA REANUDAR UN THREAD
  75.  
  76. void Reanudar()
  77. {
  78.     char n;
  79.     int Orden;
  80.     Orden=Contador;
  81.     COORD ij;
  82.     ij.X=0;            
  83.     ij.Y=14;
  84.     SetConsoleCursorPosition(hConsoleOutput,ij);
  85.     printf("Thread que quieres Reanudar?                               ");
  86.     n=getch();
  87.     ResumeThread(pPID[n-'0']);
  88.     Sleep(1);
  89.     SetConsoleCursorPosition(hConsoleOutput,ij);
  90.     printf("                               Has Reanudado la Rutina [%d]",n-'0');
  91. }
  92.  
  93.  
  94. //FUNCION PARA PARAR UN THREAD
  95.  
  96. void Parar_Thread()
  97. {
  98.     char n;
  99.     int Orden;
  100.     Orden=Contador;    
  101.     COORD ij;
  102.     ij.X=0;            
  103.     ij.Y=14;
  104.     SetConsoleCursorPosition(hConsoleOutput,ij);
  105.     printf("Thread que quieres Parar?                                         ");
  106.     n=getch();
  107.     Sleep(1);
  108.     SetConsoleCursorPosition(hConsoleOutput,ij);
  109.     printf("                               Has Parado la Rutina [%d]",n-'0');
  110.     TerminateThread(pPID[n-'0'],0);
  111.    
  112. }
  113.  
  114.  
  115. // FUNCION PARA PARAR TODOS LOS THREADS A LA VEZ
  116.  
  117. void Parar_Todo()
  118. {
  119.     int i;
  120.     int Orden;
  121.     Orden=Contador;    
  122.     COORD ij;
  123.     ij.X=0;            
  124.     ij.Y=14;
  125.     i=ij.Y;
  126.     SetConsoleCursorPosition(hConsoleOutput,ij);
  127.     printf("Has Parado TODOS los Threads                                         ");
  128.     FIN_THREAD =1;
  129.     for (i=12;i<=(12+Orden);i++)
  130.     {
  131.         printf("                                       \n");
  132.     }  
  133.     Contador=0;
  134.    
  135. }
  136.  
  137.  
  138. // FUNCION TERMINAR PROGRMA
  139.  
  140. void Fin()
  141. {
  142.     COORD ij;
  143.     ij.X=0;            
  144.     ij.Y=14;
  145.     SetConsoleCursorPosition(hConsoleOutput,ij);
  146.     Parar_Todo();
  147.     Sleep(1);
  148.     SetConsoleCursorPosition(hConsoleOutput,ij);
  149.     printf("El programa ha Terminado                                         \n");
  150.     Sleep(4000);
  151. }
  152.  
  153.  
  154. // PROGRAMA PRINCIPAL
  155.  
  156. int main()
  157. {          
  158.    
  159.     char n;
  160.     SetConsoleTitle("Ejercicio 1");
  161.     hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  162.     printf("CONTROL DE THREADS (Parte I)\n");
  163.     printf("NO LANZAR MAS DE 9 THREADS A LA VEZ\n");
  164.     printf("==================\n");
  165.     printf("Pulse:\n");
  166.     printf("L para Lanzar Thread\n");
  167.     printf("S para Suspender un Thread\n");
  168.     printf("R para Reanudar un Thread\n"); 
  169.     printf("P para Parar un Thread\n");
  170.     printf("F para Parar TODOS los Threads\n");
  171.     printf("T para Terminar\n");
  172.    
  173.     while (1)
  174.     {
  175.         switch(n=getch())
  176.         {
  177.         case 'T':
  178.             Fin();
  179.             return 1;
  180.             break;
  181.  
  182.         case 'L':
  183.             Lanzar();
  184.             break;
  185.  
  186.         case 'S':
  187.             Suspender();
  188.             break;
  189.        
  190.         case 'R':
  191.             Reanudar();
  192.             break;
  193.        
  194.         case 'P':
  195.             Parar_Thread();
  196.             break;
  197.        
  198.         case 'F':
  199.             Parar_Todo();
  200.             break;
  201.         }
  202.     }
  203.     return 0;
  204. }

Por favor, a ver si alguien me ayuda que estoy mas que desesperado, no me importaria pagar por el resultado de verdad.

Muchas gracias

Última edición por 02061; 28/05/2009 a las 11:19
  #2 (permalink)  
Antiguo 28/05/2009, 12:09
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Ayuda con la creacion de procesos y threads (win32)

¿Te lo dieron para Windows? Para la segunda parte suspender/resumir un proceso en Windows es simplemente hacerlo sobre todos sus hilos. Para la tercera podes usar un named mutex.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 28/05/2009, 12:16
 
Fecha de Ingreso: mayo-2009
Mensajes: 3
Antigüedad: 15 años
Puntos: 0
Respuesta: Ayuda con la creacion de procesos y threads (win32)

Si, lo tengo que hacer en windows
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:14.