Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
ProgressBar+tiempo en hacer POST HTTP

Hola, estoy haciendo una aplicación a modo de aprender, que me sirve para poder insertar noticias en mi página web, o mas bién una web que hice solo para estas pruebas, bueno, en localhost no hay problema por la velocidad con lo que hace, ahora la cosa llega cuando está en internet, se poner un poco lento el tiempo que tarda en hacer todo, vamos.. como todo, parecería que se congela o cuelga la aplicación y estoy queriendo poner un ProgresBars o un Gauge ( también saber la diferencias de usar uno u otro, creo que se usan igual xD )

Bueno sin mas que decir aquí les dejo mi código con el que hago el post sin problemas

Código Delphi [-]
procedure TFrmPrincipal.BEnviarClick(Sender: TObject);
var
  http: TIdHttp;
  params: TStrings;
  respuesta: string;
begin
  http := TIdHTTP.Create(Self);
  params := TStringList.Create;
  try
    params.Add('titulo='+ETitulo.Text);
    params.Add('autor='+EAutor.Text);
    params.Add('noticia='+MNoticia.Text);
    respuesta := http.Post('http://localhost/pruebas/noticias/envia_noticias.php', params);
    ShowMessage('Respuesta: ' + respuesta);
  finally
    http.Free;
    params.Free;
  end;
end;

tengo el componte Indy idHTTP, y he visto que tiene unos eventos, pero desconosco la forma de usarlos, me gustaría mucho poder saber que tiempo durará el post y que mejor forma mirando un lindo progresBars, en un FTP ya lo he logrado, pero en esto no tengo idea, supongo que es parecido, pero no lo sé.

saludos
Responder Con Cita
  #2  
Antiguo 22-04-2007
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,

Los componentes "ProgressBar" y "Gauge" cuentan con dos propiedades básicas en para su utilización: "MaxValue" y "Progress" -en el caso del "Gauge"-, y "Max" y "Position" en el caso del "ProgressBar". Estas dos propiedades indican el máximo valor que represente la barra de progreso, y el progreso actual, la posición actual del progreso. No dejes de revisar la ayuda para informarte sobre estas y otras propiedades.

Por otro lado, algunos componentes del paquete Indy añaden una serie de eventos para echarnos una mano a la hora de mostrar el progreso de las tareas que se llevan a cabo con ellos. Estos eventos son "OnWorkBegin", "OnWork" y "OnWorkEnd". También deberías revisar la ayuda sobre estos eventos, por supuesto.

Esto es lo que podría codificarse en el evento "OnWorkBegin" del componente "IdHttp" que estás usando:

Código Delphi [-]
procedure TForm1.IdHTTP1WorkBegin(Sender: TObject;
 AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
  Gauge1.MaxValue := AWorkCountMax;
  ProgressBar1.Max := AWorkCountMax;
end;

"AWorkMode" indica qué está haciendo el componente: ¿está escribiendo datos (enviando) o los está leyendo (recibiendo)? Empero, como ves no tengo en cuenta este parámetro y me limito a usar "AWorkCountMax", que ha de indicar el número de "bytes" que se estiman necesarios para realizar la tarea. Este mismo número, sin más, lo usamos para las propiedades "MaxValue" y "Max" del "Gauge" y del "ProgressBar", respectivamente.

Ahora veamos el evento "OnWork":

Código Delphi [-]
procedure TForm1.IdHTTP1Work(Sender: TObject;
 AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
  Application.ProcessMessages();
  Gauge1.Progress := AWorkCount;
  ProgressBar1.Position := AWorkCount;
end;

Aquí como ves lo primero que hacemos es decirle a la aplicación "Oyes, procesa tus mensajes, no te quedes parada"... y aprovechamos este evento para ello puesto que será el que más se ejecute de los tres que estamos tocando, y para evitar, obviamente, que la interfaz de la aplicación "se congele". En todo caso, como ves, nos limitamos a usar el parámetro "AWorkCount", que indica el número de "bytes" leídos o escritos por el componente a la hora del evento.

Es decir, teníamos antes el máximo número de bytes que iban a ser necesarios para realizar la tarea, y ahora tenemos el número de "bytes" que llevamos leídos o escritos... y ya con esto podemos perfectamente mostrar el progreso de la tarea que estemos llevando a cabo. Como ves en el evento "OnWork" nos limitamos a establecer las propiedades "Progress" y "Position" de los componentes "Gauge" y "ProgressBar", respectivamente, con el valor de "AWorkCount".

Por último tal vez nos interese tratar con el evento "OnWorkEnd":

Código Delphi [-]
procedure TForm1.IdHTTP1WorkEnd(Sender: TObject;
 AWorkMode: TWorkMode);
begin
  Gauge1.Progress := 0;
  ProgressBar1.Position := 0;
end;

Y como ves aquí no nos queda sino reinicializar a cero los valores del "Gauge" y del "ProgressBar", puesto que el trabajo (petición HTTP o POST en este caso) ya llegado a su término. Nota que estos eventos están presentes en varios componentes de Indy, no sólo en "IdHttp", y así tratar con ellos será siempre igual, sea cual sea el componente que los implemente.

Adjunto un sencillo ejemplo que descarga (pero no hace más que descargarlo) cierto programa de Internet, y va mostrando el progreso en un "Gauge" y en un "ProgressBar".
Archivos Adjuntos
Tipo de Archivo: zip Progreso de tareas con IdHttp.zip (2,8 KB, 64 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 22-04-2007 a las 16:43:00.
Responder Con Cita
  #3  
Antiguo 23-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola Dec la verdad es que me ha gustado mucho tu explicación, haz sido muy detallista. así da dusto aprender lo he entendido todo, pero no lo he podido poner en práctica con mi aplicación, no se por que pero el ProgressBar no se mueve, la aplicación se sigue congelando miemtras está enviando/recibiendo los datos, y lo he echo igual que tu, no se.. la única idiferencia es que yo hago POST nada mas, lleno un formulario, y nada mas.. pero como lo he dicho, el progressBar no se mueve, aquí dejo mi código que tengo en los 3 eventos del componente idHTTP

Código Delphi [-]
procedure TForm1.IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  PBProgreso.Max := AWorkCountMax;
  gProgreso.MaxValue := AWorkCountMax;
end;

procedure TForm1.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  Application.ProcessMessages();
  PBProgreso.Position := AWorkCount;
  gProgreso.Progress := AWorkCount;
end;

procedure TForm1.IdHTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
  PBProgreso.Position := 0;
  gProgreso.Progress := 0;
end;

también he pueso un gauge, por que pensé que el problema no era el código, pero tampoco funcionó, no se que pueda ser, tampoco no entiendo por que devería afectar lo que haga con el componente idHTTP, si según lo que entiendo la barra avanzará de acuerdo a lo que el idHTTP se lo indique, osea que no tiene que afectar si uso un código o no, uso el mismo componente y tienen esos mismos eventos como dices, pero pues no se que pasará
Si es necesário pongo mi código que tengo, pero repito NO creo que sea problema del código, por que igual realiza bién el trabajo.


saludos y muchas gracias de nuevo Dec
Responder Con Cita
  #4  
Antiguo 23-04-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Si la aplicación se "congela" vas a tener que usar anticongelante Y no estoy bromeando, entre los componentes Indy encontraras uno que se llama TIdAntiFreeze, colocalo sobre tu formulario y la aplicación ya no se congelara, y el código de dec debería de funcionar.
Responder Con Cita
  #5  
Antiguo 23-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
haha, en un principio pensé que estaba bromeando Seoane pero luego me di cuenta que no xD
Ahora con el código de Dec si que devería funcionar, pero no lo hace :S

Acabo de probar el antifreeze y dio buenos resultados por que ya no se queda así como congelado el form, pero igual me gustaría mucho que se pueda ver que tiempo tardará, y que el usuario vea el lindo ProgressBar avanzar leeeentamente miestras va por un vaso de agua

Como podrán ver tengo bién mi código, pero no he logrado hacerlo funcionar, alguna idea ?

PD Seone por cierto he visitado tu blog o web xD y esta interesante, aunque me haya gustado comentar, pero no podía, saludos y suerte
Responder Con Cita
  #6  
Antiguo 23-04-2007
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. Pues no sé. Si te fijas en el ejemplo que puse más arriba, mientras está descargándose el archivo todo "fluye" más o menos como se espera. Las barras de progreso se mueven como se espera y la interfaz de la aplicación no se congela. Sin embargo, haciendo unas pruebas, he hecho que el archivo que descargamos se guarde en disco y verás.

Mientras descargamos el archivo todo sigue yendo bien. Sin embargo, cuando se ha terminado de descargar el archivo y este va a ser escrito... (¿cerrado? ¿comprobado?) en el disco... son pocos segundos, uno o dos, pero, la aplicación se congela, efectivamente. ¿Y para qué demonios digo todo esto?

Pues porque me parece que acaso el mismo "HTTP POST" congele la interfaz de la aplicación, es decir, al fin y al cabo no estamos tratando con muchos bytes, supongo, es decir, que no ocurre como con el ejemplo que puse más arriba, que mientras se están descargando bytes va bien, pero, justo al terminar... la aplicación se congela.

No he probado el componente "IdAntiFreeze" (aunque lo conocía) y quizás esto solucionara el tema, empero, para mí que es algo que va un poco más allá, y que en el caso de un "HTTP POST" y acaso también dependiendo del tiempo de respuesta del Servidor que sea, la aplicación va a terminar congelándose más o menos...

Claro que nada de esto es una solución... pero, chico, ahora mismo no se me ocurre otra cosa que levantar este Hilo arriba del todo a ver si otro compañero se atreve con otra respuesta más oportuna que esta.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 30-04-2007
andresilvaus andresilvaus is offline
Miembro
 
Registrado: abr 2007
Posts: 10
Poder: 0
andresilvaus Va por buen camino
Cita:
Empezado por dec
Hola,

Los componentes "ProgressBar" y "Gauge" cuentan con dos propiedades básicas en para su utilización: "MaxValue" y "Progress" -en el caso del "Gauge"-, y "Max" y "Position" en el caso del "ProgressBar". Estas dos propiedades indican el máximo valor que represente la barra de progreso, y el progreso actual, la posición actual del progreso. No dejes de revisar la ayuda para informarte sobre estas y otras propiedades.

Por otro lado, algunos componentes del paquete Indy añaden una serie de eventos para echarnos una mano a la hora de mostrar el progreso de las tareas que se llevan a cabo con ellos. Estos eventos son "OnWorkBegin", "OnWork" y "OnWorkEnd". También deberías revisar la ayuda sobre estos eventos, por supuesto.

Esto es lo que podría codificarse en el evento "OnWorkBegin" del componente "IdHttp" que estás usando:

Código Delphi [-]procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin Gauge1.MaxValue := AWorkCountMax; ProgressBar1.Max := AWorkCountMax; end;


"AWorkMode" indica qué está haciendo el componente: ¿está escribiendo datos (enviando) o los está leyendo (recibiendo)? Empero, como ves no tengo en cuenta este parámetro y me limito a usar "AWorkCountMax", que ha de indicar el número de "bytes" que se estiman necesarios para realizar la tarea. Este mismo número, sin más, lo usamos para las propiedades "MaxValue" y "Max" del "Gauge" y del "ProgressBar", respectivamente.

Ahora veamos el evento "OnWork":

Código Delphi [-]procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin Application.ProcessMessages(); Gauge1.Progress := AWorkCount; ProgressBar1.Position := AWorkCount; end;


Aquí como ves lo primero que hacemos es decirle a la aplicación "Oyes, procesa tus mensajes, no te quedes parada"... y aprovechamos este evento para ello puesto que será el que más se ejecute de los tres que estamos tocando, y para evitar, obviamente, que la interfaz de la aplicación "se congele". En todo caso, como ves, nos limitamos a usar el parámetro "AWorkCount", que indica el número de "bytes" leídos o escritos por el componente a la hora del evento.

Es decir, teníamos antes el máximo número de bytes que iban a ser necesarios para realizar la tarea, y ahora tenemos el número de "bytes" que llevamos leídos o escritos... y ya con esto podemos perfectamente mostrar el progreso de la tarea que estemos llevando a cabo. Como ves en el evento "OnWork" nos limitamos a establecer las propiedades "Progress" y "Position" de los componentes "Gauge" y "ProgressBar", respectivamente, con el valor de "AWorkCount".

Por último tal vez nos interese tratar con el evento "OnWorkEnd":

Código Delphi [-]procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin Gauge1.Progress := 0; ProgressBar1.Position := 0; end;


Y como ves aquí no nos queda sino reinicializar a cero los valores del "Gauge" y del "ProgressBar", puesto que el trabajo (petición HTTP o POST en este caso) ya llegado a su término. Nota que estos eventos están presentes en varios componentes de Indy, no sólo en "IdHttp", y así tratar con ellos será siempre igual, sea cual sea el componente que los implemente.

Adjunto un sencillo ejemplo que descarga (pero no hace más que descargarlo) cierto programa de Internet, y va mostrando el progreso en un "Gauge" y en un "ProgressBar".
hola,

más onde está o ficheiro download? (googledestokp?)
Responder Con Cita
  #8  
Antiguo 30-04-2007
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,

Cita:
más onde está o ficheiro download? (googledestokp?)
Si te entiendo bien te sorprende que descargamos el archivo (googledesktop.exe) pero este no aparece en ningún lado... y esto es porque únicamente lo descargamos "en memoria", pero, luego no lo guardamos a ningún archivo. Ten en cuenta que se trataba sólo del ejemplo, de ver funcionar a las barras de progreso, pero, nada más.

Adjunto ahora el mismo ejemplo, modificado para guardar el "googledesktop.exe" que descargamos. En realidad las modificaciones son mínimas y las muestro en negrita aquí:

Código Delphi [-]
procedure TfrmPrincipal.btnDescargaClick(Sender: TObject);
var
  fs: TFileStream;
begin
  btnDescarga.Enabled := false;
  try
    fs := TFileStream.Create(rsRutaArchivo, fmCreate);
    try
      IdHTTP.Get(rsUrlDescarga, fs);
    finally
      fs.Free;
    end;
  finally
    btnDescarga.Enabled := true;
  end;
  ShowMessage(rsFinDescarga);
end;
Archivos Adjuntos
Tipo de Archivo: zip Progreso de tareas con IdHttp.zip (2,6 KB, 26 visitas)
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 30-04-2007
andresilvaus andresilvaus is offline
Miembro
 
Registrado: abr 2007
Posts: 10
Poder: 0
andresilvaus Va por buen camino
my spanish is very BAD! sorry...

si, este nuevo code is work 100% (file save in c:\)!! now i'm change other directory :P ehehhe

gracias, vale!!
Responder Con Cita
  #10  
Antiguo 30-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Alguna idea Dec con mi anterior post ??
Ese es el código en el que empleo la barra de progreso, pero creo que tendría que hacerlo de otra forma verdad ??
Creo que tendría que ser en el buble.

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
Ajax.class.js - Sencilla forma de hacer peticiones HTTP en segundo plano dec PHP 10 11-01-2007 03:50:49
Librería para hacer peticiones HTTP para delphi 5 rlago Internet 3 06-11-2006 10:28:18
mandar un post http con idHTTP hidal C++ Builder 6 16-08-2006 01:02:57
IBDatase Insert Post Edit Post ariefez Firebird e Interbase 4 12-10-2005 01:53:04
Como hacer petición HTTP Bauhaus1975 Varios 2 13-06-2005 21:12:38


La franja horaria es GMT +2. Ahora son las 14:19:26.


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