Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Varios
Register FAQ Members List Calendar Guía de estilo Today's Posts

Coloboración Paypal con ClubDelphi

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 17/01/2008
matabyte's Avatar
matabyte matabyte is offline
Miembro
 
Join Date: Jan 2008
Location: Kyoto, Japon
Posts: 177
Poder: 19
matabyte Va por buen camino
Question Mandar trabajos a distintos procesadores.

Buenos días, soy nuevo en el foro pero no programando. Empecé con Turbo Pascal 6 y ahora disfruto programando en "Delphi 2007". Ya he programado aplicaciones bastante grandes, y ahora me encuentro con un problema y no he conseguido encontrar información por Internet.

Antes dejaba a windows elegir por donde iban los hilos (threads) de mis aplicaciones, pero ahora estoy haciendo una aplicación de uso intensivo de CPU y me gustaría saber si sabrían como mandar trabajos (o threads), para que se ejecuten en distintas CPUs.

Pensaba en algo al estilo:

Código Delphi [-]
  Thread_Lectura.execute(CPU1);
  Thread_Calculo.execute(CPU2);

Igual es imposible esto que pido con delphi, pero por intentarlo... Un saludo y gracias por adelantado
Reply With Quote
  #2  
Old 17/01/2008
cHackAll's Avatar
[cHackAll] cHackAll is offline
Baneado?
 
Join Date: Oct 2006
Posts: 2,159
Poder: 22
cHackAll Va por buen camino
Lo que pides es aplicable a procesos; no a hilos.

Saludos
Reply With Quote
  #3  
Old 17/01/2008
jachguate's Avatar
jachguate jachguate is offline
Miembro
 
Join Date: May 2003
Location: Guatemala
Posts: 6,254
Poder: 30
jachguate Va por buen camino
No puede hacerse de la manera que lo describís, pero si puede hacerse.

Cada hilo puede tener una mascara de afinidad con CPU's diferente. El sistema utiliza esa mascara para asignar los hilos con diferentes cpu's.

Esta mascara se establece llamando a la función SetThreadAffinityMask, declarada en la unidad Windows.

En delphi3000, encontré este artículo, que te provee de una clase que ya encapsula esto en una propiedad.

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.

La mascara de afinidad, es un mapa de bits, donde el bit 1 se corresponde con el cpu 0

así, si queres que un hilo se ejecute solamente en el cpu 3 (de una core 2 quad, por ejemplo), la mascara de afinidad será $8 (en delphi) o 0x8 (en c).

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate

Last edited by jachguate : 17/01/2008 at 21:17. Reason: corregir link
Reply With Quote
  #4  
Old 17/01/2008
cHackAll's Avatar
[cHackAll] cHackAll is offline
Baneado?
 
Join Date: Oct 2006
Posts: 2,159
Poder: 22
cHackAll Va por buen camino
Hufff; muy cierto amigo jachguate, yo solo reconocía a SetProcessAffinityMask y había dejado a un "lado" a SetThreadAffinityMask.

Saludos
Reply With Quote
  #5  
Old 18/01/2008
matabyte's Avatar
matabyte matabyte is offline
Miembro
 
Join Date: Jan 2008
Location: Kyoto, Japon
Posts: 177
Poder: 19
matabyte Va por buen camino
Muchas gracias por la respuesta!.

Es lo que necesitaba, mandar Threads distintos a CPUs distintas. Me imaginaba que Delphi tendría algo para poder manejar los Threads a las CPUs, pero no lo encontraba.

Muchas gracias de nuevo.

PD: Por cierto, no sabréis si existe en Delphi alguna función para saber el número de CPUs existentes?

Last edited by matabyte : 18/01/2008 at 04:46.
Reply With Quote
  #6  
Old 18/01/2008
mamcx's Avatar
mamcx mamcx is offline
Moderador
 
Join Date: Sep 2004
Location: Medellín - Colombia
Posts: 3,941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Sin embargo, ten en cuenta que Windows, asi como cualquier OS, tiene un algoritmo de asignacion de cargas que muy probablemente sea mas listo que lo que uno haga.

Lo unico que se me ocurre que podria servir es siempre mandar a procesadores >1. Pero no he hecho pruebas para demostrar si seria mejor asi o que....
__________________
El malabarista.
Reply With Quote
  #7  
Old 18/01/2008
jachguate's Avatar
jachguate jachguate is offline
Miembro
 
Join Date: May 2003
Location: Guatemala
Posts: 6,254
Poder: 30
jachguate Va por buen camino
Quote:
Originally Posted by matabyte View Post
PD: Por cierto, no sabréis si existe en Delphi alguna función para saber el número de CPUs existentes?
¡claro!: cpu count en delphi.

Te recomiendo preguntarle también a google, que regularmente da buenas respuestas!

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Reply With Quote
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
procesadores de tres nucleos de AMD gmontes Noticias 10 18/01/2008 06:00
Unir trabajos de impresión mlara Impresión 2 31/05/2005 23:44
Iconos distintos en distintos escritorios. abel Linux 2 16/02/2004 14:55
Interbase con 2 procesadores jzginez Firebird e Interbase 2 08/10/2003 20:45


All times are GMT +2. The time now is 01:52.


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