Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-01-2006
Cosgaya Cosgaya is offline
Miembro
 
Registrado: jun 2005
Posts: 105
Poder: 19
Cosgaya Va por buen camino
Calcular tiempo

hola a todos:
tengo un problema con un programa para calcular numeros primos
trabajo con delphi 7.
resulta que el bucle para calcular los numeros primos me consume todo el procesador y queria calcular el tiempo que tarda en completarse con un componente timer que sume uno cada segundo a una variable pero resulta que no empieza a sumar hasta que se acaba el proceso para sacar numeros primos, si pueden ayudarme
gracias
este es el codigo:
Código Delphi [-]
unit primo;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  numero:longint;
  cantidad:longint;
  division:longint;
  confir:longint;
  hora:integer;
  minuto:integer;
  segundo:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled := true;
cantidad :=(strtoint(edit1.Text));
numero :=2;
division :=2;
while (numero < cantidad)do
begin
    while(division <= numero)do
    begin
      // comprabar si numero es divisible
      if numero mod division = 0 then
      begin
       confir := confir +1;
      end;
    division := division +1;
   end;
   division :=2;
  if confir =1 then
  begin
  memo1.Lines.Add(inttostr(numero));
  confir := 0;
  end
  else begin
  memo2.Lines.Add(inttostr(numero));
  confir :=0;
  end;
numero := numero +1;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
segundo := (strtoint(label1.caption)) +1;
label1.caption := (inttostr(segundo));
timer1.Enabled := true;
end;
end.
Responder Con Cita
  #2  
Antiguo 25-01-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Se me ocurren dos cosas: una, que utilizes el método de "Application" "ProcessMessages" en el interior de alguno de los bucles, o en todos ellos; y dos, que utilizes un Hilo aparte para el procedimiento que se "come" al Hilo principal de la aplicación.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 25-01-2006
Cosgaya Cosgaya is offline
Miembro
 
Registrado: jun 2005
Posts: 105
Poder: 19
Cosgaya Va por buen camino
hola dec, soy no vato en delphi.
me podrias explicar como es para crear otro hilo??
gracias
Responder Con Cita
  #4  
Antiguo 25-01-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno, el tema de las aplicaciones multi-hilo tiene mucha tela que cortar, y yo no podría ni hacerme un chaleco, pero, muy sencillamente, el propio IDE de Delphi te lo pone bastante hacedero. Siguiente el menú File -> New -> Others -> Delphi Files (esto en Delphi 2006) -> Thread Object el entorno de preparará una plantilla que incluye prácticamente todo lo que necesitas para emplear un Hilo de ejecución separado del principal de la aplicación.

Básicamente, insisto, en la plantilla encontrarás un método de nombre "Execute" ya declarado he implementado (a falta que añadas en él el código fuente que quieres que se ejecute en el Hilo de marras). Es ahí donde puedes ejecutar el código que se "zampa" al Hilo principal de la aplicación. Bien, pero, ¿cómo inicias el Hilo? Pues creándo el objeto correspondiente, como cualquier otra clase, algo así:

Código Delphi [-]
  FMiHilo := TMiHilo.Create(false);

Con solo esa instrucción estarás creando el Hilo, y, en virtud del parámetro del constructor (false, en este caso) estarás haciendo (más información en la ayuda) que comienze la ejecución del método "Execute" del Hilo. Lo que ocurre es que esa ejecución se llevará a cabo en otro Hilo distinto del principal, de tal modo que tu aplicación pueda seguir con otras tareas, por ejemplo, o, simplemente, mostrando una interfaz "disponible" para el usuario.

En estos Foros se habrá tratado más de una vez y más de dos el tema de los Hilos. Yo no te puedo procurar mucha más información, sino decirte que la complejidad del tema acaso deba ir un poco en función de tus necesidades: es posible que con poco que aprendas sobre ello te sea más que suficiente para llevar a cabo lo que precisas, quiero decir. Y, por otro lado, ¿probaste con el método "ProcessMessages" de "Application"? Puede que para lo que quieres hacer sea bastante.

Actualización: Adjunto un ejemplo muy, muy sencillo a ver si se aprecia la idea.
Archivos Adjuntos
Tipo de Archivo: zip hilo.zip (2,6 KB, 28 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 25-01-2006 a las 19:26:51.
Responder Con Cita
  #5  
Antiguo 25-01-2006
Cosgaya Cosgaya is offline
Miembro
 
Registrado: jun 2005
Posts: 105
Poder: 19
Cosgaya Va por buen camino
no, no he probado con el método "ProcessMessages" de "Application", porque todavia no se de que va eso, ahora iba a investigar por el foro, pero tambien probare lo del hilo para ver como es.
muchas gracias dec.
Responder Con Cita
  #6  
Antiguo 25-01-2006
Avatar de Chente(rMan)
Chente(rMan) Chente(rMan) is offline
Miembro
 
Registrado: ago 2005
Posts: 89
Poder: 19
Chente(rMan) Va por buen camino
y si pruebas usando GetTickCount junto con un Application.ProcessMessages


Saludos.

Vicente López.
Responder Con Cita
  #7  
Antiguo 25-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Algunos comentarios respecto a tu código:
  • El ciclo interior

    Código Delphi [-]
    while (division <= numero) do

    puedes sustituirlo por

    Código Delphi [-]
    while (division*division <= numero) do

    con lo cual ahorras muchas vueltas.

  • En el momento en que encuentras un divisor:

    Código Delphi [-]
    confir := confir +1;

    ya no es necesario continuar el ciclo interior. Usa break para interrumpirlo.

  • Si vas a usar sentencias como

    Código Delphi [-]
    memo1.Lines.Add(inttostr(numero));

    durante el proceso, asegúrate de poner Memo1.Lines.BeginUpdate antes de comenzar y Memo1.Lines.EndUpdate al terminar. Esto porque, además del tiempo requerido por el algortimo en sí, pierdes bastante para actualizar un control visual.

  • Finalmente, no entiendo qué quieres hacer con el Timer. Toma en cuenta que conforme numero crezca, cada vuelta del ciclo tarda más, así que no puedes tener una estimación uniforme.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Funcion de tiempo pedromanuel JAVA 7 29-11-2006 00:00:58
Y vosotros que creías que lo sabíais todo. gryphus Humor 20 06-07-2005 23:20:35
Tiempo en String miguel_fr Varios 4 25-04-2004 20:06:05
Unidades de Tiempo obiwuan Humor 0 06-05-2003 21:32:51


La franja horaria es GMT +2. Ahora son las 01:12:03.


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