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 15-01-2010
eugenio_vb eugenio_vb is offline
Registrado
 
Registrado: ene 2010
Posts: 2
Poder: 0
eugenio_vb Va por buen camino
Question Cuestionamiento con Hilos

Tengo un problema que no se como resolverlo por medio de Delphi, la cuestión es la siguiente:

- Supongamos que tengo una clase derivada de TThread llamada MiHilo la cual contiene varios metodos y dentro del Execute hay un loop repeat que debe estar en ejecuccion siempre durante la ejecucion del programa (ya que es un Servidor TCP y debe atender las peticiones de los clientes)

- Dentro de la clase MiHilo existe un método funcion llamado MiFuncion que devuelve un cierto valor el cual se obtiene de los procesos que se realizan dentro de Execute y que son generados dadas ciertas condiciones por lo que el tiempo que tardan en generarse es variable.

Si llamo MiFuncion (de un objeto instanciado de la clase MiHilo) desde el hilo principal del programa (ya sea por medio de algun evento de un boton o algo por el estilo) el programa principal no debe de continuar con las siguientes instrucciones ya que debe de tener el valor de regeso de MiFuncion.

El problema aqui es como hacer que MiFuncion espere a obtener los valores generados por Execute para posteriormente regresarselos al hilo principal del programa... todo esto sin alterar la ejecucion de Execute, ya que si meto un ciclo repeat en MiFuncion para esperar la respuesta (por medio de alguna bandera para saber que Execute tiene el resultado), la respuesta de Execute nunca llegara ya que MiHilo estara atorado en MiFuncion y Execute no podria seguir ejecutandose.

Que solucion podria existir a este problema???

Gracias por su tiempo.
Responder Con Cita
  #2  
Antiguo 15-01-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por eugenio_vb Ver Mensaje
Si llamo MiFuncion (de un objeto instanciado de la clase MiHilo) desde el hilo principal del programa (ya sea por medio de algun evento de un boton o algo por el estilo) el programa principal no debe de continuar con las siguientes instrucciones ya que debe de tener el valor de regeso de MiFuncion.
Normalmente la gente tiene el problema contrario; Tienen un ejecutable y desean continuar mientras hacen una segunda tarea; Tú, que ya tienes implementados los hilos para conseguir eso, ahora resulta que quieres que el programa principal se espere....
¡Este mundo está loco!

Cita:
Empezado por eugenio_vb Ver Mensaje
El problema aqui es como hacer que MiFuncion espere a obtener los valores generados por Execute para posteriormente regresarselos al hilo principal del programa... todo esto sin alterar la ejecucion de Execute, ya que si meto un ciclo repeat en MiFuncion para esperar la respuesta (por medio de alguna bandera para saber que Execute tiene el resultado), la respuesta de Execute nunca llegara ya que MiHilo estara atorado en MiFuncion y Execute no podria seguir ejecutandose.
Que solucion podria existir a este problema???
Tal vez no he entendido bien tu problema o la forma en que está constrído. Posíblemente algo de código mostrando cómo es la clase de tu hilo, la funcióny cómo es la llamada ayudaría.

Si la función está dentro del hilo, comparte ese hilo de ejecución con el procedimiento Execute, por lo tanto, la lógica dice que al hacer la llamada a la función que está dentro del hilo esta debería esperarse a que el Execute terminara (no así el hilo principal que continuará).

Segun dices, eso no es lo que te está pasando, de ahí que no acabo de comprender muy bien el problema ; Algo se me escapa....
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 15-01-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Se supone que el Hilo principal de la aplicacion se va detener en una funcion hasta que ésta devuelva el resultado esperado, un ejemplo claro de esto es la funcion ShowModal de los formularios.
Código Delphi [-]
begin
Form1.ShowModal;//<--se detiene la ejecucion aqui hasta que se cierra el formulario
Edit1.Text:='Hola';//esta linea solo se va a ejecutar si la funcion anterior termino
end;
Siguiendo ese ejemplo, el truco que buscas seria hacer detener tu funcion (MiFuncion) hasta que el metodo Execute del hilo que creaste devuelva o resuelva el resultado que buscas(segun te entiendo); para lo cual la solucion esta en utilizar una variable dentro de tu clase Hilo (MiHilo) que indique si ya el metodo Execute resolvio el resultado esperado, para que tu funcion (MiFuncion) lo devuelva;
La variable a utilizar para eso podria ser una Booleana;
Un codigo ejemplo seria:
Código Delphi [-]
unit Unit2;

interface

uses
  Classes;

type
  MiHilo = class(TThread)
  private
    { Private declarations }
   YA:Boolean;//Variable que necesito inicializar en FALSO ; ya velo tu donde debes hacerlo
  protected
    procedure Execute; override;
  Public
    Function MiFuncion():Integer;//<-- es solo un ejemplo
  end;


implementation

uses SysUtils;

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure MiHilo.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ MiHilo }

function MiHilo.MiFuncion: Integer;
begin
  while not YA do ;//<---se Duerme Mientras que la variable YA este en falso
  //Desde Luego el metodo Execute ya debe estar ejecutandose
  Result:=Lo_Que_Sea;
end;

procedure MiHilo.Execute;
begin
  { codigo de ejecucion del metodo Execute}
 ...
 {cuando este metodo resuelva el resultado esperado por la funcion MiFuncion
  entonces cambiamos el valor de la variable YA;  algo asi:}
 if Se_Resolvio_Lo_que_esparaba_Resolverse then
     YA:=True;
end;
end.
Espero que se haya entendido la idea.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 15-01-2010 a las 15:46:25.
Responder Con Cita
  #4  
Antiguo 15-01-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Thumbs up

Cita:
Empezado por rgstuamigo Ver Mensaje
Espero que se haya entendido la idea.
Pues se ha entendido y bastante bien.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 15-01-2010
eugenio_vb eugenio_vb is offline
Registrado
 
Registrado: ene 2010
Posts: 2
Poder: 0
eugenio_vb Va por buen camino
Gracias por tu tiempo, tu respuesta me parece muy clara, ahora mi duda sobre tu código es la siguiente:

1.- Si ejecuto externamente MiFuncion (desde otro hilo), MiFuncion al entrar en un bucle while, frenara la ejecucion de Execute hasta terminar el bucle?

2.- Si el propio Execute llama a MiFuncion , entonces si habria un freno a Execute, no??? , ahi es donde encuentro el problema porque Execute no generara las condiciones para salir del bucle.

2.- El ejecutar una funcion externamente de un Hilo hace que se ejecute en el hilo que la llama o en el hilo al que pertenece?
Responder Con Cita
  #6  
Antiguo 15-01-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Cita:
Empezado por eugenio_vb Ver Mensaje
Gracias por tu tiempo, tu respuesta me parece muy clara, ahora mi duda sobre tu código es la siguiente:

1.- Si ejecuto externamente MiFuncion (desde otro hilo), MiFuncion al entrar en un bucle while, frenara la ejecucion de Execute hasta terminar el bucle?
Como bien He comentado en el codigo, se supone que primero debe ser ejecutado el procedure Execute antes de MiFuncion,Ojo debes tener en cuenta que en el ejemplo o codigo que te he puesto arriba, se asume que sólo el procedure Execute es el unico que puede hacer terminar a MiFuncion, si por ejemplo la variable "YA" nunca cambiara de de False a True, pues la funcion MiFuncion NUNCA TERMINARIA, asique debes de tener cuidado en ese sentido.
Cita:
Empezado por eugenio_vb Ver Mensaje
2.- Si el propio Execute llama a MiFuncion , entonces si habria un freno a Execute, no??? , ahi es donde encuentro el problema porque Execute no generara las condiciones para salir del bucle.
Todo depende de la variable "YA",por tanto es ilógico(segun mi ejemplo) llamar de un metodo a otro, sabiendo que el metodo que llama al otro es el unico que puede hacerlo terminar., a menos que se codifique algo que hiciera que cambiara la Variable "YA" antes de llamar a MiFuncion desde el Execute.,para que MiFuncion pueda terminar OJO con eso.
Cita:
Empezado por eugenio_vb Ver Mensaje
2.- El ejecutar una funcion externamente de un Hilo hace que se ejecute en el hilo que la llama o en el hilo al que pertenece?
No te entiendo muy bien tu pregunta, pero si és, lo que pienso que quieres decirme, quisas este ejemplo te pueda ayudar:
Código Delphi [-]
var h1,h2,h3:MiHilo;
begin

  h1:=MiHilo.Create(True);//creo una instancia de clase MiHilo
  h2:=MiHilo.Create(True);//creo otra instancia de clase MiHilo
  h3:=MiHilo.Create(True);//creo otra instancia mas de clase MiHilo
 {los tres hilo han sido creado detenido es decir no estan corriendo
  (ver el parametro del Create en la ayuda de Delphi)}
  h1.Resume;//lanzo el hilo 1 o hago que corra,se ejecuta su procedure execute 
  h1.MiFuncion;//llamo a MiFuncion del Hilo 1

  h2.Resume;//lanzo el hilo 2 o hago que corra, se ejecuta su procedure execute
  h2.MiFuncion;//llamo a MiFuncion del Hilo 2

  h3.Resume;//lanzo el hilo 3 o hago que corra,se ejecuta su procedure execute
  h3.MiFuncion;//llamo a MiFuncion del Hilo 3
{Como puedes ver cada Hilo tiene sus Propios metodos
No es lo mismo la funcion MiFuncion del hilo 1 con la del hilo 2 ó 3.
Como bien te he dicho cada uno tiene sus propios metodos y su propia variable "YA"
es lo que se llama Programacion Orientada a Objeto POO
}
end;
Espero se haya entendido.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 15-01-2010 a las 20:05:15.
Responder Con Cita
  #7  
Antiguo 15-01-2010
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
Cita:
Empezado por eugenio_vb Ver Mensaje
1.- Si ejecuto externamente MiFuncion (desde otro hilo), MiFuncion al entrar en un bucle while, frenara la ejecucion de Execute hasta terminar el bucle?
Sí, frenará la ejecución Execute del hilo desde el que llamas a dicha función, independientemente de la clase en la que esté implementada.

Cita:
Empezado por eugenio_vb Ver Mensaje
2.- Si el propio Execute llama a MiFuncion , entonces si habria un freno a Execute, no??? , ahi es donde encuentro el problema porque Execute no generara las condiciones para salir del bucle.
Sí, habría un freno del Execute del hilo en cuestión.

Cita:
Empezado por eugenio_vb Ver Mensaje
3.- El ejecutar una funcion externamente de un Hilo hace que se ejecute en el hilo que la llama o en el hilo al que pertenece?
Hace que se ejecute en el hilo que la llama, por lo que el hilo al que pertenece sigue trabajando sin verse afectado (podría verse afectado, si manipulases variables de dicha clase desde esa función).
__________________
"La recompensa de una buena acción está en haberla hecho"
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 con hilos zajoma OOP 4 13-04-2009 16:48:15
Los hilos se destruyen?? dtomeysoto Varios 1 13-03-2009 22:00:14
Hilos johurgi Varios 2 16-07-2007 10:57:08
ver hilos Cosgaya Varios 1 07-06-2005 20:35:16
Hilos con COM urush30 Varios 0 21-09-2004 10:07:37


La franja horaria es GMT +2. Ahora son las 06:37:34.


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