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-02-2015
atani123 atani123 is offline
Miembro
 
Registrado: jul 2006
Posts: 63
Poder: 18
atani123 Va por buen camino
TProgressBar va retrasado

Tengo un problema de visualizacion y no encuentro como solucionarlo. A ver si alguien sabe como hacerlo.

Supongamos esta parte de codigo (pgbfile es un TProgressBar)
Código Delphi [-]
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;
    end;
    sleep(1000);
    application.ProcessMessages;
  end;
  showmessage( 'fin');
end;

Vale pues 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. Antes con Delphi 7 esto era clavado pero ahora con XE tengo este problema. Solo es estetico, pero queda muy feo que un proceso finalice cuando en pantalla la barra va por el 80%.


gracias a todos de nuevo.
Responder Con Cita
  #2  
Antiguo 25-02-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Prueba movieno la línea Application.ProcessMessages
Será mas lento, pues por cada iteración del bucle (100.000 veces) debe verificar si hay mensajes pendientes de procesar.

Código Delphi [-]
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;

Puedes mejorar el rendimiento si ejecutas esta línea solo cada n pasadas.

Código Delphi [-]
    for I := 1 To 100000 do
    begin
      pgbfile.Position := I;
      // Solo procesa esto cada 1000 iteraciones del bucle
      if (I mod 1000 = 0) then
         Application.ProcessMessages;
    end;
Responder Con Cita
  #3  
Antiguo 25-02-2015
atani123 atani123 is offline
Miembro
 
Registrado: jul 2006
Posts: 63
Poder: 18
atani123 Va por buen camino
Nada tio, el resultado es el mismo, quiza avanza un poco mas, pero el resultado sigue siendo el mismo
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.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
He probado tu código, sin modificar y me funciona perfectamente.
Cinco veces avanza de 0 a 100% la barra de progreso.
Al final la barra está completa y sale el mensaje de "fin".

Esto me hace pensar que lo que tu tienes no es exactamente lo que has publicado aquí.
Yo solo he creado un proyecto de prueba con un ProgressBar y un botón, que en su evento OnClick ejecuta tu código.
Has la prueba con un proyecto nuevo para verificar que no se trata de alguna otra cosa que influya en tu aplicación.

También puedes porbar con Repaint.
Código Delphi [-]
    for I := 1 To 10000 do
    begin
      pgbfile.Position := I;
      pgbfile.Repaint;
    end;
Responder Con Cita
  #5  
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
  #6  
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
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
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 21:13:25.


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