Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   como crear un programa multi-nucleo (https://www.clubdelphi.com/foros/showthread.php?t=62477)

kurono 28-12-2008 07:07:31

como crear un programa multi-nucleo
 
hola amigos del foro como esta tengo esta curiosidad me he dado cuenta que la mayoria de los programa no aprovechan los procesadores dual core de esta generacion y me gustaria saber si con delphi se prodria hacer una aplicacion para tales fines

Kipow 28-12-2008 10:20:47

Usando la busqueda consegui esto :)

kurono 28-12-2008 17:39:24

ok gracia probare esos codigos

Neftali [Germán.Estévez] 28-12-2008 20:02:48

Busca ayuda sobre threads. En los foros hay muchos hilos al respecto.
En mi página tienes también un par de ejemplos con código completo de utilización de threads.

Si no recuerdo mal, en el FTP del foro también había alguno.

kurono 31-12-2008 02:31:54

amigos e estado probando los codigos que e visto en los hilos relacionados con el tema que e puesto y e escogido uno y funciona a la perfecion pero el inconveniente que veo es que solo funciona en modo consola me gustaria hacer que funcione en modo grafico con formulario a qui le muestro el codigo

Código Delphi [-]
uses Windows;

var
 Dummy, Mask: Cardinal;
 si: TStartupInfo = (cb: SizeOf(TStartupInfo));
 pi: TProcessInformation;

begin
 CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, si, pi); // Ejecutamos el Bloc de notas,
 GetProcessAffinityMask(DWORD(-1), Dummy, Mask);                      // Obtenemos en Mask, los CPUs disponibles,
 if (Mask and 2) <> 0 then                                            // Verificamos si existen dos CPUs como mínimo...
  SetProcessAffinityMask(pi.hProcess, 2);                             // Le asignamos dicho proceso solo al segundo CPU
end.

function Windows.SetProcessAffinityMask(hProcess, dwProcessAffinityMask: Cardinal): LongBool;
// Cada bit de dwProcessAffinityMask representa un microprocesador o nucleo
hProcess := OpenProcess(PROCESS_SET_INFORMATION, False, dwProcessID); // donde dwProcessID es el identificador del proceso
hProcess := GetCurrentProcess; {-1}
hProcess := TProcessInformation.hProcess;

Kipow 31-12-2008 03:01:46

Lo que sucede es que con ese codigo estas cambiando la afinidad del proceso en ese caso programa (bloc de notas) a un nucleo especifico, con el codigo de los links que te pase antes es para que asignes los multiples hilos de tu aplicacion a los diferentes nucleos. no se si me explico?

kurono 31-12-2008 03:25:25

si entiendo lo q dices pero si te refiere a este codigo me da error no copila me dice modulo unit incorrecto

Código Delphi [-]
unit ExThread;

interface

uses
  Classes;

type
  TExThread = class(TThread)
  private
    FAffinityMask: DWord;
    procedure SetAffinity(const Value: DWord);
    { Private declarations }
  protected
    procedure Execute; override;
  public
    property AffinityMask : DWord read FAffinityMask write SetAffinity;
  end;

implementation

{ Important: Methods and properties of objects in VCL can only be used in a
  method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TExThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TExThread }

procedure TExThread.Execute;
begin
  { Place thread code here }
end;

procedure TExThread.SetAffinity(const Value: DWord);
begin
  FAffinityMask := SetThreadAffinityMask(Handle,Value);
  if FAffinityMask = 0 then raise Exception.Create('Error setting thread affinity mask : ' + IntToStr(GetLastError));
end;

end.

Kipow 31-12-2008 04:05:16

Código Delphi [-]
unit exthread;

interface

uses
  Classes, types, Sysutils, Windows;

type
  TExThread = class(TThread)
  private
    FAffinityMask: DWord;
    procedure SetAffinity(const Value: DWord);
    { Private declarations }
  protected
    procedure Execute; override;
  public
    property AffinityMask : DWord read FAffinityMask write SetAffinity;
  end;

implementation

{ Important: Methods and properties of objects in VCL can only be used in a
  method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TExThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TExThread }

procedure TExThread.Execute;
begin
  { Place thread code here }
end;

procedure TExThread.SetAffinity(const Value: DWord);
begin
  FAffinityMask := SetThreadAffinityMask(Handle,Value);
  if FAffinityMask = 0 then raise Exception.Create('Error setting thread affinity mask : ' + IntToStr(GetLastError));
end;

end.
Solo tenes que guardar el codigo en una unidad nueva llamada exthread.pas y listo. (solo le hacian falta unas unidades en el uses)

kurono 31-12-2008 04:15:15

ok gracia ya me funciona


La franja horaria es GMT +2. Ahora son las 04:19:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi