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 09-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Agregarle parametros al metodo Execute de TThread

hola estoy comenzando la programacion por hilos y ando un poco enrredado en esto:

tengo la siguiente declaracion:

Código Delphi [-]
TCompararMd5 = class(TThread)
     protected
        procedure Execute(nIdx: integer); override;
     end;
  end;

el asunto es que al compilar me da el error:

Cita:
Declaration of 'Execute' differs from previous declaration
segun investigue eso se debe a que los metodos deben declararse como su ancestro, ahora me gustaria saber como puedo hacer para que ese metodo me acepte parametros???

Gracias
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #2  
Antiguo 09-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
investigando un poco encontre este mensaje de Neftali

Override y Virtual

la duda sigue porq sengun entendi si lo coloco virtual pierdo la herencia del ancestro
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #3  
Antiguo 09-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Que yo sepa, no puedes.

En la clase TThread, ya está puesto como Virtual y abstract:
- Por Virtual, ya puedes hacer un override del método.
- Por abstract, no puedes dejar su implementación vacía, si lo haces, en ejecución obtendrás una excepción "abstract error".

Dicho esto, puedes sobreescribir (override) el método, pero no puedes cambiar los parámetros, ni si quiera con overload;

Solución a este paradigma, crear un método nuevo:
Código Delphi [-]
TCompararMd5 = class(TThread)
     protected
        procedure ExecuteWithIndex(nIdx: integer);
        procedure Execute; override;
     end;
  end;

Desde ExecuteWithIndex llamas a Execute tu método que sobreescribe el heredado. Dentro de Execute si puedes usar inherited;
Código Delphi [-]
procedure TCompararMd5.ExecuteWithIndex(nIdx: integer);
begin
  // hacer lo que sea con nIdx;
  Execute; // llamas a tu execute, el que has sobreescrito tú.
end;

procedure TCompararMd5.Execute;
begin

  // llamar al Execute heredado
  inherited;
 // o bien, si deseas dejarlo de forma explícita:
 inherited Execute;
end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 09-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por eduarcol Ver Mensaje
la duda sigue porq sengun entendi si lo coloco virtual pierdo la herencia del ancestro
No entiendo muy bien.

Si ahora vas a crear otra clase que hereda de TCompararMd5, sugiero que hagas virtual el ExecuteWithIndex, el Execute lo dejas tal cual, es decir:
Código Delphi [-]
TCompararMd5V2 = class(TCompararMd5)    // versión 2  
protected
   procedure Execute; override;
end;
Cuando ahora llames a Execute, se ejecutarán en este orden:
TCompararMd5V2.Execute que al llamar a inherited ejecutará:
TCompararMd5.Execute que al llamar a inherited ejecutará:
TThread.Execute

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 09-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
pues entonces si es verdad lo que investigue

otra solucion que he rebuscado es lo siguiente, en la unit tengo el objeto del formulario y el hilo, si comparto una variable global alli puedo compartir la informacion entre los dos objetos.

Solo queria asegurarme si mi resultados eran correctos porq nunca he trabajado con hilos
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #6  
Antiguo 09-11-2007
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
Editado: veo que ya te han propuesto una solución parecida a esta... Ops! :P


Si realmente necesitas llamar el execute con parámetros, entonces emula el exeute con un proceso tuyo, con lo cual sí podrás pasarle parámetros...

Ejemplo:

Código Delphi [-]
// variable declarada en la sección private de la classe TMiThread
FnIdx: Integer;

// implementación de tu propio execute
procedure TMiThread.MiExecute(nIdx: integer);
begin
  FnIdx:=nIdx;
  Execute;
end;

// implementación del execute
procedure TMiThread.Execute;
begin
  if FnIdx then
    // bla bla bla!
end;

El código puede tener alguna errata, porqué lo he hecho de memoria sin probarlo xD Pero seguro que entiendes la idea xD

Saludos.

Última edición por xEsk fecha: 09-11-2007 a las 21:54:05.
Responder Con Cita
  #7  
Antiguo 09-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
gracias Xesk, estaba pensando en algo similar. He quedado en algo como esto:

Código Delphi [-]
unit unPricipal;

***

type

  //Hilo que compara los MD5 de los archivos
  TCompararMd5 = class(TThread)
     protected
        procedure Execute; override;
  end;

  //Formulario de soporte visual
  TfrActualizador = class(TForm)
    ***
  private
    { Private declarations }
    ***
  public
    { Public declarations }
    ***
  end; 

var
  nIdx: Integer;

//Compara los MD5 del archivo local y web y devuelve true o false
procedure TCompararMd5.Execute;
var
   aStream: TMemoryStream;
   cLocal: String;
   cWeb: TStringList;
   nIndice: Integer;
begin
   inherited;
   //Toma el MD5 del archivo local
   nIndice := nIdx; //Toma el valor de nIdx para que al ejecutarse otro hilo asegurarse que continua el mismo valor
   aStream := TMemoryStream.Create;
   cWeb    := TStringList.Create;
   try
      cLocal := AnsiUpperCase(MD5Sum(cRutaLocal.Strings[nIndice] + '\' + cArchivo.Strings[nindice]));
      if (Get(cHtml.Strings[nIndice] + '/pMd5.php?archivo=' + cArchivo.Strings[nIndice], aStream)) and (cLocal <> '') then
      begin
         aStream.Position:= 0; // <-- Hay que rebobinar el stream :-D
         cWeb.LoadFromStream(aStream);
         cWeb.Strings[0] := AnsiupperCase(cWeb.Strings[0]);
         //Compara el md5 del local con el web
         Resultado := cLocal = cWeb.Strings[0];
      end
      else
         Resultado := False;
   finally
      FreeandNil(aStream);
      FreeandNil(cWeb);
   end;
end;

*****

//Procedimiento donde se crea y se llama el hilo
procedure TfrActualizador.pActualizar(nIndice: Integer);
var
   cUrl, cRuta: String;
   thcMd5: TCompararMd5;
begin
   //Crea el hilo para comparar los MD5
   thcMd5 := TCompararMd5.Create(True);
   nIdx := nIndice;
   thcMd5.Resume;
   //Actualiza el sistema desde internet
   if not Resultado then
   begin
      //Descargar el archivo de la web
      cUrl := cHtml.Strings[nIndice] + '/' + cArchivo.Strings[nIndice];
      cRuta := cRutaLocal.Strings[nIndice] + '\' + cArchivo.Strings[nIndice];
      Bajar(cUrl, cRuta);
   end;
end;

******

end.
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #8  
Antiguo 09-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Código Delphi [-]
var
  nIdx: Integer;

¿no debería ser así?:
Código Delphi [-]
threadvar  // ojito a la palabra reservada de delphi.
  nIdx: Integer;

Si es una variable que va a usarse dentro de un Thread, debe ser ThreadSafe.

Aunque no veo el asunto claro. Estas creando una clase TCompararMd5 que a partir de un índice abre un archivo. ¿no sería mejor crear una propiedad en el Thread llamada Filename? así no se comparte información entre el hilo y su padre, además nos permitiría reusar la clase sin modificarla.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 09-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
No termino de comprender si nIdx debe compartir su valor entre los diferentes hilos o no, mejor revisa tú mismo si debe ser threadvar o no.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 09-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Disculpa la demora pero estaba revisando la ayuda acerca de threadvar y si es lo que necesito, muchisimas gracias
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
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
Tthread Vs. Application -> ProcessMessages(); Peterman Varios 8 31-05-2007 03:05:03
TThread y cerrar una ventana previamente abierta gluglu OOP 1 14-05-2007 19:19:54
Execute Immediate jjarias Firebird e Interbase 3 27-04-2006 15:14:07
Como Liberar un Tthread???? AGAG4 Varios 3 25-04-2005 22:16:40
Lio con TThread diegofhernando Varios 0 20-01-2004 17:58:35


La franja horaria es GMT +2. Ahora son las 07:25:05.


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