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#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <windows.h>
HANDLE hConsoleOutput;
HANDLE pPID[128];
// Variables Globales
int Contador=0;
int NUMERO=0;
int FIN_THREAD=0;
// FUNCIONES PARA LOS THREADS
// FUNCION QUE HARAN TODOS LOS THREADS
void Rutina(void *p)
{
// char Linea[100000]; // Esta declaración sólo sirve para ver el consumo de memoria
int Orden;
Orden=Contador;
COORD xy; // COORD me dice dónde se escribirá toda la info de los Threads
xy.X=0; // Coordenadas en el eje X
xy.Y=16+Orden; // Coordenadas en el eje Y
while (!FIN_THREAD)
{
SetConsoleCursorPosition(hConsoleOutput,xy );
printf(" Rutina [%d] dice que %d\n",Orden
,NUMERO
); Sleep(1000);
NUMERO++;
}
SetConsoleCursorPosition(hConsoleOutput,xy );
_endthread();
}
// FUNCION PARA LANZAR UN THREAD
void Lanzar()
{
FIN_THREAD = 0;
NUMERO=0;
Contador++;
pPID[Contador]=(HANDLE)_beginthread(Rutina, 0, NULL);
}
// FUNCION PARA SUSPENDER UN THREAD
void Suspender()
{
char n;
int Orden;
Orden=Contador;
COORD ij;
ij.X=0;
ij.Y=14;
SetConsoleCursorPosition(hConsoleOutput,ij);
printf("Thread que quieres Suspender? "); SuspendThread(pPID[n-'0']);
Sleep(1);
SetConsoleCursorPosition(hConsoleOutput,ij);
printf(" Has Suspendido la Rutina [%d]",n
-'0'); }
// FUNCION PARA REANUDAR UN THREAD
void Reanudar()
{
char n;
int Orden;
Orden=Contador;
COORD ij;
ij.X=0;
ij.Y=14;
SetConsoleCursorPosition(hConsoleOutput,ij);
printf("Thread que quieres Reanudar? "); ResumeThread(pPID[n-'0']);
Sleep(1);
SetConsoleCursorPosition(hConsoleOutput,ij);
printf(" Has Reanudado la Rutina [%d]",n
-'0'); }
//FUNCION PARA PARAR UN THREAD
void Parar_Thread()
{
char n;
int Orden;
Orden=Contador;
COORD ij;
ij.X=0;
ij.Y=14;
SetConsoleCursorPosition(hConsoleOutput,ij);
printf("Thread que quieres Parar? "); Sleep(1);
SetConsoleCursorPosition(hConsoleOutput,ij);
printf(" Has Parado la Rutina [%d]",n
-'0'); TerminateThread(pPID[n-'0'],0);
}
// FUNCION PARA PARAR TODOS LOS THREADS A LA VEZ
void Parar_Todo()
{
int i;
int Orden;
Orden=Contador;
COORD ij;
ij.X=0;
ij.Y=14;
i=ij.Y;
SetConsoleCursorPosition(hConsoleOutput,ij);
printf("Has Parado TODOS los Threads "); FIN_THREAD =1;
for (i=12;i<=(12+Orden);i++)
{
}
Contador=0;
}
// FUNCION TERMINAR PROGRMA
void Fin()
{
COORD ij;
ij.X=0;
ij.Y=14;
SetConsoleCursorPosition(hConsoleOutput,ij);
Parar_Todo();
Sleep(1);
SetConsoleCursorPosition(hConsoleOutput,ij);
printf("El programa ha Terminado \n"); Sleep(4000);
}
// PROGRAMA PRINCIPAL
int main()
{
char n;
SetConsoleTitle("Ejercicio 1");
hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
printf("CONTROL DE THREADS (Parte I)\n"); printf("NO LANZAR MAS DE 9 THREADS A LA VEZ\n"); printf("==================\n"); printf("L para Lanzar Thread\n"); printf("S para Suspender un Thread\n"); printf("R para Reanudar un Thread\n"); printf("P para Parar un Thread\n"); printf("F para Parar TODOS los Threads\n");
while (1)
{
{
case 'T':
Fin();
return 1;
break;
case 'L':
Lanzar();
break;
case 'S':
Suspender();
break;
case 'R':
Reanudar();
break;
case 'P':
Parar_Thread();
break;
case 'F':
Parar_Todo();
break;
}
}
return 0;
}
Por favor, a ver si alguien me ayuda que estoy mas que desesperado, no me importaria pagar por el resultado de verdad.
Muchas gracias