PDA

Ver la Versión Completa : Mandar a ejecutar programas en micros diferentes?


Anel Hernandez
31-10-2011, 17:54:22
Hola,

estoy mandando a ejecutar un programa de calculo compilado en Fortran de esta manera.

var
Info:TShellExecuteInfo;
begin
with Info do begin
cbSize := SizeOf(ShellExecuteInfo);
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Handle;
lpVerb := 'open';
lpFile := PChar('C:\Archivos de programa\programa\programa.exe');
lpParameters := PChar('D:\programa.inp');
lpDirectory := PChar('D:\');
nShow := SW_SHOW;
end;
ShellExecuteEx(@INFO);

trabaja perfectamente. Pero debo hacerlo en numerosas ocasiones y he comprobado que solo trabaja con uno de los microprocesadores (mi PC tiene 2). He visto que algunas GUI permiten mandar a correr programas simultaneamente en diferentes micros.

Como?

gracias

Casimiro Notevi
31-10-2011, 20:32:55
Haz una búsqueda por "Thread".

Por cierto, recuerda poner etiquetas al código, por ejemplo:

http://neftali.clubdelphi.com/images/UtilizarTAGs.png


Verás que se muestra mucho mejor, te he modificado el que has puesto antes.

ecfisa
31-10-2011, 22:34:15
Hola Anel.

Primeramente hay que asegurarse que el S.O. esté soportando su uso, en Windows:

Inicio -> Ejecutar -> MsConfig + Intro.
Pestaña arranque -> botón Opciones avanzadas -> Seleccionar número de procesadores (2/n) -> Aceptar -> Aceptar -> reiniciar.


También revisá estos enlaces:

Hilos de ejecución 1 (http://delphiallimite.blogspot.com/2009/05/los-hilos-de-ejecucion-1.html)
Hilos de ejecución 2 (http://delphiallimite.blogspot.com/2009/05/los-hilos-de-ejecucion-2.html)
Hilos de ejecución 3 (http://delphiallimite.blogspot.com/2009/06/los-hilos-de-ejecucion-y-4.html)


Un saludo.

Anel Hernandez
02-11-2011, 12:37:01
Hola,

ya hice las comprobaciones recomendadas y lei los temas sugeridos. pero mi duda no es sobre la simultaneidad, es sobre como decirle a programa que ejecute programa1.inp en el micro1 (por llamarlo de alguna manera) y programa2.inp en el otro micro?

o windows lo distribuye a su conveniencia?

saludos y gracias

ecfisa
02-11-2011, 13:37:31
Hola.

Según entiendo, es el planificador de trabajos (Job Scheduler) del S.O. quién decide a qué procesador asignar el proceso que tiene que ser ejecutado mediante el Dispatcher.

Al menos yo, no conozco procedimiento, función o código Delphi que pueda tomar o alterar esa decisión.

Un saludo.

Anel Hernandez
02-11-2011, 17:27:58
ok, gracias.

con que funcion desde Delphi puedo saber la cantidad de nucleos que tiene el micro? alguna de la API? como puedo saber el numero de procesadores que tiene asignado windows? eso que verificamos arriba con el MsConfig?

gracias

ecfisa
02-11-2011, 22:40:23
Hola Anel.

Para obtener los datos del procesador usando el registro de windows:

uses Registry;

function DatosProcesador: TStrings;
const
CPUKEY = '\HARDWARE\DESCRIPTION\System\CentralProcessor';
var
i: Integer;
TS1: TStrings;
begin
TS1:= TStringList.Create;
try
with TRegistry.Create do
try
RootKey:= HKEY_LOCAL_MACHINE;
if OpenKey(CPUKEY, False) then
begin
GetKeyNames(TS1);
Result:= TStringList.Create;
for i:= 0 to TS1.Count -1 do
if OpenKey(CPUKEY + '\' + TS1[i], False) then
begin
Result.Add('Núcleo: '+IntToStr(i));
Result.Add('Nombre: '+ReadString('ProcessorNameString'));
Result.Add('Identificador: '+ReadString('Identifier'));
Result.Add('Fabricante: '+ReadString('VendorIdentifier'));
Result.Add('Velocidad Mhz: '+IntToStr(ReadInteger('~Mhz')));
Result.Add(' ');
end;
end;
finally
Free;
end;
finally
TS1.Free;
end;
end;


Llamada de ejemplo:

ListBox1.Items:= DatosProcesador;


Un saludo.

Anel Hernandez
03-11-2011, 10:03:19
Hola, gracias

Hice los cambios en el Msconfig sugeridos arriba y resulta que cuando mando 2 procesos con ese cambia el calculo demora el doble de lo que demoraba antes.

saludos

ecfisa
03-11-2011, 13:49:26
Hola Anel.

Es un comportamiento bastante atípico...

Pero, al estar involucrado un lenguaje (Fortran) que desconozco por completo, sólo se me ocurre que consultes con el soporte del S.O.: support (http://support.microsoft.com/?ln=es-es)
Quizá allí, encuentres encuentres la explicación.

Un saludo.