![]() |
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:
La declaración del thread se encuentra de la siguiente manera:
La verdad, no entiendo muy bien los threads y me gustaría saber si podrían ayudarme. De antemano gracias :) |
Creo que el codigo quedo incompleto porque usas genericos, de lo contrario no compilaria
(Es un error del foro que Casimiro no quiere arreglar :p) 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 |
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. |
Cita:
Creo recordar que si se ponen espacios "se los traga"
|
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 modificado:
Una vez hechos esos cambios, el programa compilo sin problema :) Muchas gracias a AgustinOrtu por su ayuda :D |
Y funciona bien? Veo demasiados casteos no seguros en ese codigo :confused:
No se puede resolver usando constraints como dije mas arriba? la clase TObjectList de Generics.Collections lo hace de esa manera:
|
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. |
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" :D:D |
Hola...
Cita:
Saludos... |
La franja horaria es GMT +2. Ahora son las 18:13:39. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi