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 06-09-2016
xangiesaurx xangiesaurx is offline
Miembro
NULL
 
Registrado: feb 2016
Posts: 57
Poder: 9
xangiesaurx Va por buen camino
Problemas con Threads

Hola a todos, me encuentro en un nuevo dile, estoy migrando un programa que tengo en Delphi 2010 a Delphi XE5, en el cual solo marca 2 errores:

[dcc32 Error] GenericBlockingQueue.pas: E2089 Invalid typecast

El código en donde marca el error es el siguiente:

Código Delphi [-]
procedure TBlockingQueueContentHandler< T >.NotifyDequeue(sender : TObject;
                                                        const item : T;
                                                        action : TCollectionNotification);
begin
  if (action = cnRemoved) and (TObject(item) <> nil) then  <------ Aquí marca el primero
    TObject(item).Free;                                    <------ Aquí marca el segundo 
end;

La declaración del thread se encuentra de la siguiente manera:

Código Delphi [-]
TBlockingQueueContentHandler< T > = class(TThread)
  private
    fBlockingQueue            : TBlockingQueue< T >;
    fOnNewItemInQueueFunction : TOnNewItemInQueueFunction;
  protected
    procedure Execute; override;
    procedure NotifyDequeue(sender : TObject; const item : T; action : TCollectionNotification); virtual;
  public
    constructor Create(blockingQueue : TBlockingQueue< T >;
                       onNewItemInQueueFunction : TOnNewItemInQueueFunction< T >;
                       isObjectDataT : Boolean = false);
    destructor Destroy; override;
  end;

La verdad, no entiendo muy bien los threads y me gustaría saber si podrían ayudarme.
De antemano gracias

Última edición por Casimiro Notevi fecha: 07-09-2016 a las 01:03:21.
Responder Con Cita
  #2  
Antiguo 07-09-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Creo que el codigo quedo incompleto porque usas genericos, de lo contrario no compilaria

(Es un error del foro que Casimiro no quiere arreglar )

Asumiendo TBlockingQueueContentHandler <T>, el compilador no tiene informacion suficiente para poder comparar un generico T contra nil. Que pasaria si usara la cola asi:

TBlockingQueueContentHandler <Integer>? o TBlockingQueueContentHandler <TAlgunRecord>? Esos tipos no se pueden comparar contra nil

Lo que podes hacer es darle mas informacion al compilador, estableciendo constraints, que vendrian a ser restricciones

Los constraint se indican seguidos de : (dos puntos) luego de la declaracion del generico, por ejemplo:

TBlockingQueueContentHandler <T: class> --> indica que el tipo generico T es una clase (no podria ser un Integer, por ejemplo)

Revisa la documentacion para mas informacion
Responder Con Cita
  #3  
Antiguo 07-09-2016
xangiesaurx xangiesaurx is offline
Miembro
NULL
 
Registrado: feb 2016
Posts: 57
Poder: 9
xangiesaurx Va por buen camino
Hola AgustinOrtu, antes que nada agradezco tu pronta respuesta, efectivamente hacen falta los <T> en varias partes :P
Revisare bien el código y daré una leída a lo que me has pasado, en cuanto tenga la solución pasaré a informar, así como cualquier problema que me encuentre (si se da el caso) en el proceso.

Solo una duda, este cambio es debido a que así se implementa en XE5? Por que en 2010 funciona sin problemas.
Responder Con Cita
  #4  
Antiguo 07-09-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por AgustinOrtu Ver Mensaje
Creo que el codigo quedo incompleto porque usas genericos, de lo contrario no compilaria
(Es un error del foro que Casimiro no quiere arreglar )
Es un error de vbulletin, no tenemos el código fuente para modificarlo, no sé si habrá algún método para solucionarlo.
Creo recordar que si se ponen espacios "se los traga"
Código Delphi [-]
 < T >
Responder Con Cita
  #5  
Antiguo 09-09-2016
xangiesaurx xangiesaurx is offline
Miembro
NULL
 
Registrado: feb 2016
Posts: 57
Poder: 9
xangiesaurx Va por buen camino
Que tal, buenos días a todos, vengo a comentarles que ya encontré la solución, hice unas modificaciones al código.

Código que daba errores:

Código Delphi [-]
procedure TBlockingQueueContentHandler< T >.NotifyDequeue(sender : TObject;
                                                        const item : T;
                                                        action : TCollectionNotification);
begin
  if (action = cnRemoved) and (TObject(item) <> nil) then 
    TObject(item).Free;                                    
end;

Código modificado:

Código Delphi [-]
procedure TBlockingQueueContentHandler< T >.NotifyDequeue(sender : TObject;
                                                        const item : T;
                                                        action : TCollectionNotification);
begin
  if (action = cnRemoved) and (PObject(@item)^ <> nil) then  
    PObject(@item)^.Free;                                    
end;

Una vez hechos esos cambios, el programa compilo sin problema
Muchas gracias a AgustinOrtu por su ayuda
Responder Con Cita
  #6  
Antiguo 09-09-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Y funciona bien? Veo demasiados casteos no seguros en ese codigo

No se puede resolver usando constraints como dije mas arriba?

la clase TObjectList de Generics.Collections lo hace de esa manera:

Código Delphi [-]
  TObjectList< T: class > = class(TList< T >)
  protected
    procedure Notify(const Value: T; Action: TCollectionNotification); override;
  // ...

procedure TObjectList< T >.Notify(const Value: T; Action: TCollectionNotification);
begin
  inherited;
  if OwnsObjects and (Action = cnRemoved) then
    Value.DisposeOf;
end;
Responder Con Cita
  #7  
Antiguo 09-09-2016
xangiesaurx xangiesaurx is offline
Miembro
NULL
 
Registrado: feb 2016
Posts: 57
Poder: 9
xangiesaurx Va por buen camino
Intenté con los constraints, pero era cambiar muchas declaraciones y otras partes del código.
Hice pruebas con los cambios que realice y todo funciona bien, igualmente, haré un branch nuevo y haré todos los cambios que me pide que haga usando los constraints.
Responder Con Cita
  #8  
Antiguo 10-09-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Es mas que nada para que tu codigo quede mas seguro

Esos cast forzosos son un peligro, y deberian evitarse a menos que sea como ultimo recurso; este no es el caso.

Otra cosa muy peligrosa es el operador '@', el principal problema que tiene es que de esa forma el compilador se pasa por encima el checkeo de tipos (todo vale) y te estas perdiendo una de las grandes ventajas de un lenguaje compilado, que detecta estos errores y te ahorran problemas al momento de correr tu aplicacion

Fijate que estas casteando la direccion de memoria de tu parametro a un puntero a TObject y luego accediendo al TObject referenciado por el puntero. Es como demasiado "hardcore"
Responder Con Cita
  #9  
Antiguo 13-09-2016
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Cita:
Empezado por xangiesaurx Ver Mensaje
Intenté con los constraints, pero era cambiar muchas declaraciones y otras partes del código.
Hice pruebas con los cambios que realice y todo funciona bien, igualmente, haré un branch nuevo y haré todos los cambios que me pide que haga usando los constraints.
Para casos como este es que existe algo llamado refactoring


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
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
Problemas con Threads gluglu Varios 13 10-02-2011 10:26:36
uso de threads JULIPO API de Windows 2 25-07-2007 16:09:06
Threads in DLL's Gianni Varios 0 20-07-2007 22:18:23
Threads zombies Archer Varios 1 25-09-2006 19:19:38
problemas con threads dentro de un componente elcigarra OOP 26 26-05-2005 04:29:35


La franja horaria es GMT +2. Ahora son las 19:23: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