Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-06-2004
felixgo felixgo is offline
Miembro
 
Registrado: may 2003
Posts: 86
Poder: 21
felixgo Va por buen camino
Esperar a que termine un proceso

Hola

He creado un formulario que llama a un componente para enviar un fax (utilizo apro). He creado otro formulario que llama al primero para enviar un fax con un fichero bmp que he generado, necesito esperar a que termine de enviar el primer fax para seguir enviado faxes, pero no quiero utilizar un bucle de espera. Que puedo hacer para saber cuando ha terminado un proceso. El componente de apro tiene un evento que es onfinish, pero como hago para esperar a que salte ese evento sin consumir recursos en un bucle?

gracias
Responder Con Cita
  #2  
Antiguo 02-06-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
¿Y porqué no quieres usar un bucle de espera?.... si le devuelves el control a la aplicación, esta entrará en "un bucle de espera" ...
Por otro lado, si tienes un evento OnFinish, será cuestión de escribir el código a realizar cuando termine en este evento, en lugar de escribirlo a continuación del llamado al proceso.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 02-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Supongo que estas pensando en un bucle que envia todos los faxes:

algo como:
Código:
repeat
  EnviarFax(numero);
until NoHayMasNumeros;
De esta forma, no hay manera de "esperar" si no es con un "bucle de espera".

Pero si repensas el proceso de otra forma, no habra necesidad de él y podes valerte del evento OnFinish ya mencionado.

Mi idea es:

Declaras un método que envia solamente un fax. Este se llamará EnviarSiguienteFax y tendrá la lógica para tomar el número de fax de donde lo estes sacando. Por ejemplo, si es una base de datos, simplemente se ubicará en el siguiente registro y enviará el fax. Si no hay mas fax para enviar, no hara nada y saldrá.

Luego en el evento OnFinish del componente fax simplemente llamarás a EnviarSiguienteFax.

Para iniciar el envio, vamos a hacer una rutina llamada EnviarPrimerFax, que inicializará el DataSet y luego llamará a EnviarSiguienteFax.

Quedaria algo como:

Código Delphi [-]
Procedure TForm1.EnviarSiguienteFax;

Var
  Numero : String;

Begin
  if TablaFaxes.eof Then
    Exit; //no se hace nada mas!
  //Envia el fax del registro actual:
  Numero := TablaFaxes.FieldByName('NumeroFax').AsString;
  TablaFaxes.Next;  // ubica la tabla en el siguiente registro
  EnviarFax(Numero);
end;

Procedure TForm1.FaxOnFinish;

Begin
  EnviarSiguienteFax;
end;

Procedure EnviarPrimerFax;

Begin
  TablaFaxes.Active := True;
  TablaFaxes.First;
  EnviarSiguienteFax;
End;

Hay aqui cierta recursividad indirecta. Dependerá de como el componente envie el fax si esa recursividad es real o no. Entiendo que devuelve el control a la aplicación, con lo que se liberaría el stack. Si no es asi, bastaria con cambiar el evento OnFinish para que no llame directamente a EnviarSiguienteFax, sino que se valga de un timer, por ejemplo, que sea el que genere la siguiente llamada.

Espero que la idea general te sirva de ayuda.

Hasta luego

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

Última edición por jachguate fecha: 02-06-2004 a las 19:37:04.
Responder Con Cita
  #4  
Antiguo 02-06-2004
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
Hombre, aunque no diga for, while ni repeat, a fin de cuentas es un bucle:

Código:
EnviarFax->OnFinish
    ^          |
    |__________|
Responder Con Cita
  #5  
Antiguo 02-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Digamos que es un bucle "indirecto"...

Entiendo que lo que ocurre es que el componente mencionado funciona de manera Asincrona... y el problema es que Felixgo lo que no quiere es tener que hacer algo del tipo:

Código Delphi [-]
componente.EnviarFax;
repeat
until not componente.busy;

Para mantener un bucle como el que describi en la primera parte de mi post anterior.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
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


La franja horaria es GMT +2. Ahora son las 10:37:55.


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