Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-02-2015
atani123 atani123 is offline
Miembro
 
Registrado: jul 2006
Posts: 63
Poder: 18
atani123 Va por buen camino
He hecho lo que tu dices, proyecto nuevo, 2 button y un progressbar, el codigo y el resultado es el mismo, no llega al 100%.

Si pongo el repaint, si que funciona pero el tiempo se multiplica. Me puedes pasar tu exe compilado, a ver si es problema de compilacion o de procesador o tarjeta grafica.

Si puedes mandamelo a esta direccion xxxxxx@xxxxxx.xx

2 botones y y progress bar, esta es la Unit tal cual

Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    pgbfile: TProgressBar;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i, j : integer;
begin
  pgbfile.Min := 1;
  pgbfile.Max := 100000;
  for j := 1 To 5 do
  begin
    for I := 1 To 100000 do
    begin
      pgbfile.Position := I;
      pgbfile.repaint;
    end;
    sleep(1000);
  end;
  showmessage( 'fin');
end;

procedure TForm1.Button2Click(Sender: TObject);
var i, j : integer;
begin
  pgbfile.Min := 1;
  pgbfile.Max := 100000;
  for j := 1 To 5 do
  begin
    for I := 1 To 100000 do
    begin
      pgbfile.Position := I;
      Application.ProcessMessages;
    end;
    sleep(1000);
  end;
  showmessage( 'fin');
end;

end.

Gracias.

Última edición por Casimiro Notevi fecha: 25-02-2015 a las 17:36:30. Razón: Las cosas del foro, en los foros :) Mira nuestra guía de estilo.
Responder Con Cita
  #2  
Antiguo 25-02-2015
atani123 atani123 is offline
Miembro
 
Registrado: jul 2006
Posts: 63
Poder: 18
atani123 Va por buen camino
Nuevos datos

Si State = pbsNormal el recorrido (1 pasada) lo hace en menos de 1 segundo pero no repinta bien
Si State es pbsError o pbsPaused tarda bastante mas y repinta bien.

¿Cuanto te tarda a ti mas o menos en hacer los 100000 ciclos?
Responder Con Cita
  #3  
Antiguo 25-02-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.744
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Me tarda 28 a 32 segundos sin hacer nada en el bucle.
Tarda de 49 a 52 segundos si hago Repaint o ProcessMessages.

Código Delphi [-]
procedure TFMMain.Button1Click(Sender: TObject);
 var i, j : integer;
 Comienzo: TDateTime;
begin
  Comienzo := Now;
  pgbfile.Min := 1;
  pgbfile.Max := 100000;
  for j := 1 To 5 do
  begin
    for I := 1 To 100000 do
    begin
      pgbfile.Position := I;
      // 52 segundos : pgbfile.Repaint;
      // 49 segundos : Application.ProcessMessages;
      // 28 segundos : Sin instrucciones aqui
    end;
    Application.ProcessMessages;
    sleep(1000);
  end;
  ShowMessage( 'fin ' + DateTimeToStr(Now - Comienzo));
end;
Responder Con Cita
  #4  
Antiguo 25-02-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.744
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Te dejo el ejemplo que hice aquí: https://www.dropbox.com/s/c376crthg5...uebas.zip?dl=0
Es el código del proyecto y el ejecutable.
Responder Con Cita
  #5  
Antiguo 25-02-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
atani123,

Cita:
Empezado por atani123
...Tengo un problema de visualización...el Progressbar no sigue el ritmo...las cuatro primeras veces la barra solo llega hasta el 10% y vuelve a comenzar, y la ultima vez, sale el mensaje de "fin" y el Progressbar aun va por el 70%...Supongo que el tema es que el ProgressBar lleva un Thread independiente, ¿pero es posible evitar esto y sincronizarlo exacto?...Solo es estético...Antes con Delphi 7 esto era clavado pero ahora con XE tengo este problema...


Pregunto: ¿Que versión de Delphi y Windows utilizas?, ¿Es Windows de 32 o 64 bits?.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ProgressBar1: TProgressBar;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FreePBThread(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TPBThread = class(TThread)
  private
     procedure UpdatePB;
  protected
     procedure Execute; override;
  end;

const
   Max = 100000;
   PBStep = 1;

var
  Form1: TForm1;
  PBThread : TPBThread;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   Label1.Caption := EmptyStr;
   Label1.AutoSize := True;
   Label1.Font.Color := clBlue;
end;

procedure TPBThread.UpdatePB;
var
   PctDone : Extended;
   PBPos, PBMax, PctPB : String;
begin
   with form1 do
   begin
      if Assigned(PBThread) then
      begin
         ProgressBar1.StepBy(PBStep);
         PctDone := ProgressBar1.Position / ProgressBar1.Max;
         PBPos := FormatFloat('#,###,###,###', ProgressBar1.Position);
         PBMax := FormatFloat('#,###,###,###', ProgressBar1.Max);
         PctPB := FormatFloat('0.00 %', PctDone * 100);
         Label1.Caption := Format('Estadística : %s de %s (Ejecutado %s)',[PBPos, PBMax, PctPB]);
      end;
   end;
end;

procedure TPBThread.Execute;
var
   i : Integer;
begin
   FreeOnTerminate := True;
   for i := 1 to Max do
   begin
      if not Terminated then
         Synchronize(UpdatePB)
      else
         Exit;
   end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if not Assigned(PBThread) then
   begin
      ProgressBar1.Position := 0;
      ProgressBar1.Min := 1;
      ProgressBar1.Max  := Max;
      PBThread := TPBThread.Create(False);
      PBThread.OnTerminate := FreePBThread;
   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   if Assigned(PBThread) then
   begin
      PBThread.Terminate;
      PBThread := nil;
      ProgressBar1.Position := 0;
      Label1.Caption := EmptyStr;
   end
   else
      MessageDlg('No Existe un Hilo Activo para Finalizar', mtInformation, [mbOK], 0);
end;

procedure TForm1.FreePBThread(Sender: TObject);
begin
   PBThread := nil;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   if Assigned(PBThread) then
      CanClose := False;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Action := caFree;
end;

end.
El código anterior en Delphi XE7 sobre Windows 7 Professional x32, Ejemplifica el uso de un TProgressBar en un hilo y como sincronizar este con la aplicación, como se muestra en la siguiente imagen:



Nota: El código del ejemplo, funciona correctamente en Delphi 7 sobre Windows 7 Professional x32.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 03-03-2015 a las 03:01:03.
Responder Con Cita
  #6  
Antiguo 26-02-2015
atani123 atani123 is offline
Miembro
 
Registrado: jul 2006
Posts: 63
Poder: 18
atani123 Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Te dejo el ejemplo que hice aquí: https://www.dropbox.com/s/c376crthg5...uebas.zip?dl=0
Es el código del proyecto y el ejecutable.

Mira, he puesto tu ejecutable, sin compilar ni tocar nada como podras ver en la fecha de exe es el que tu me has pasado y he hecho un video con los resultados, exactamente los mismo. Asi que debe de ser algo de windows, es muy extraño. (W7 profesional x64)

https://dl.dropboxusercontent.com/u/72239104/prueba.zip
Responder Con Cita
  #7  
Antiguo 27-02-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
atani123,

Cita:
Empezado por atani123
...he puesto tu ejecutable, sin compilar ni tocar nada...los resultados, exactamente los mismo...debe de ser algo de windows, es muy extraño...(W7 profesional x64)...


Pregunto : ¿Probastes el código sugerido el Msg #9?

Te comento que el código del Msg #9 funciona sin ningún tipo de cambio en Delphi 7 y Delphi XE7 sobre Windows 7 Professional x32 y Delphi XE4 sobre Windows 7 Professional x64, te sugiero probarlo sin ninguna modificación y ver si se mantiene el mismo comportamiento.

Espero sea útil

Nelson.
Responder Con Cita
  #8  
Antiguo 02-03-2015
atani123 atani123 is offline
Miembro
 
Registrado: jul 2006
Posts: 63
Poder: 18
atani123 Va por buen camino
Buenos dias de nuevo, nlsgarcia si que probé tu codigo y funciona correctamente pero siceramente se complica demasiado para simplemente utilizar un progressbar.

El objetivo final es que el progressbar vaya incluido dentro del evento OnzipProgress del Tzipmaster por eso el StepIt no me sirve y utilizo el Position.

Los nuevos avances son los siguientes, he coseguido que funcione con el codigo original, cambiando dentro de las opciones de aplicacion el Thenes, es decir, "Project/Options/Application/Runtime Themes = None" pero vamos, pierde toda la gracia de windows 7.

Tengo que decir que decir tambien que TProgressBar tienes 2 propiedades que son el BarColor y BarBackgroundColor, que por supuesto no funcionan a no ser que se desactive lo de los temas.

No se, ¿alguien tiene alguna idea o algo que aportar?,

Gracias a todos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Problema TProgressBar e IdFTP jlrdz OOP 1 14-06-2011 13:19:21
Generar TProgressBar en Forma Dinámica GerTorresM OOP 1 12-04-2009 03:02:04
TProgressBar cíclico nativo (marquee) (añadida solución 3) xEsk Trucos 11 04-12-2008 21:13:58
TProgressBar Delphius OOP 2 09-12-2004 05:31:46


La franja horaria es GMT +2. Ahora son las 03:33:02.


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