FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Dudas con Hilo en ejecución
Hola, espero que podais echarme una mano con esto, a ver tengo un boton que hace una llamada a una función, esta realiza una tarea pesada que incluso llega a congelar la aplicación, por ese motivo he empezado a mirarme los hilos y ver un poco como funcionan, me he bajado el pdf de "delphi al limite" ademas de mirar por la web, pero no me aclaro. El problema es que la llamada a la función es la siguiente:
Y el error que me da al usar el hilo es este... Como veis, la llamada a la función tiene dos parametros, entonces, suponiendo que fuera button1.Click el encargado de ejecutar el hilo y este a su vez hace la llamada a la función ¿como seria? o dicho de otro modo ¿como le paso al hilo esa función para que ejecute todo el código? No sé si me he explicado bien, espero que si. Saludos y ojalá podais ayudarme. Última edición por danielmj fecha: 20-10-2013 a las 21:52:06. Razón: mejorar pregunta |
#2
|
||||
|
||||
Ufff, creo que es más fácil un simple copia y pega del mensaje, ¿no crees?
Cita:
|
#3
|
||||
|
||||
Hola danielmj.
Publicá la declaración de la tu clase TThread y del procedimiento "CortarArchivo". Por el texto del mensaje de error y por como realizas la llamada, parece que lo has declarado como un procedimiento normal y no como método de una clase TThread. Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#4
|
||||
|
||||
jaja es cierto, me complique mas de la cuenta. Saludos.
|
#5
|
||||
|
||||
Hola ecfisa, saludos
mira.. Declaración del hilo...
hago la llamada al hilo...
Procedimiento "CortarArchivo"...
Así está ahora mismo, ¿alguna sugerencia? Una cosa, no seais muy duros con el código que estoy verdecillo ya sé que habra mil formas de hacerlo mas claro y limpio pero todo a su tiempo. De momento funciona que no es poco jajaj. P.D.: El ejemplo que uso de hilo es de la web "crea tu software" y no sé si será valido en mi caso. Saludos y gracias. Última edición por danielmj fecha: 20-10-2013 a las 23:25:31. Razón: error al copiar |
#6
|
||||
|
||||
Buenas,
Ya lo tengo solucionado, el error era mi despiste y no estudiar bien las explicaciones, a ver el problema estaba (o eso entiendo) que para pasar parametros a un hilo, hay que declarar un type tal que este:
Obviamente, cambiando nombres, y esto yo no lo hacía. Por otra parte, tampoco declaraba en el uses la unidad "ActiveX", y esta es necesaria para incializar el hilo con el parametro "CoInitialize"
Bueno, esa es la solución. Espero que le sirva a alguien. Saludos. Última edición por danielmj fecha: 21-10-2013 a las 11:58:42. Razón: error al escribir |
#7
|
||||
|
||||
Hola danielmj.
Gracias por presentarnos la solución Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#8
|
||||
|
||||
error al salir
Hola, ¿por que si en el boton de salir unicamente tengo "Close" me da dos errores en forma de excepcion? lo esquematizo un poco para situaros...
No entiendo por que me da error cuando solo tiene la orden de salir y cerrar la aplicacion, a no ser que haya heredado algun "estado" de los formularios cortar/unir y lo tenga en memoria a la hora de salir de la aplicacion. Pero si es por ese motivo, tampoco sé como liberarlo. ¿alguna idea? gracias y un saludo. |
#9
|
||||
|
||||
No somos adivinos ni tenemos una bola mágica. Creo que ya has leido nuestra guía de estilo, pues eso
|
#10
|
||||
|
||||
bien casimiro, supongo que te refieres a las mayusculas, no lo hice con mala intención, simplemente no me di cuenta, habrás visto en otras de mis preguntas que jamás lo pongo todo en mayusculas, aqui una muestra:
http://www.clubdelphi.com/foros/showthread.php?t=84451 O quizás ha sido por usar la sintanxis delphi, lo mismo, pensé en esquematizarlo y no caí en la cuenta de la etiqueta "Quote". En cuanto al problema y para que no sea necesario hacer uso de unas dotes de adivino que no se tienen, os dejo este enlace de un video que he hecho donde se ve exactamente el error. Y aquí el diagrama del formulario esta vez sin usar la sintaxis de delphi... Cita:
Gracias. Última edición por danielmj fecha: 27-10-2013 a las 20:44:16. |
#11
|
||||
|
||||
Sólo me refería a que pusieras el código para que podamos verlo
No sirve de nada la explicación ni el video. |
#12
|
||||
|
||||
hola,
aqui pongo el codigo de toda la unidad del formulario principal, desde el que se hace la llamada a los otros formularios:
Como podeis ver en el "button3" que es el que termina el programa y sale, solo tiene "close", no hay nada mas, por eso me tiene descolocado ese error, ademas ocurre sin hacer nada mas, solo ejecutar y salir y ya falla. Gracias y saludos. |
#13
|
||||
|
||||
Buenas.
Llego un poco tarde al hilo y a lo mejor no aporto gran cosa, entre otras razones porque me faltan bastantes datos para hacerme a la idea completa del problema. Por un lado, has colocado las definiciones de unas clases para hilos que no se de donde salen; Me refiero a estas:
Buscando por Internet he llegado a esta página dónde se habla de esas clases, así que supongo que debe ser esa unidad (a estas cosas es a lo que se refieren cuando te hablan de que no somos adivinos,...). Por otro lado, uno de esos threads, llama al procedimiento CortarArchivo, que has colocado más arriba. No se qué hacen esas clases para trabajar con threads, por lo que veo en la página te hacen más fácil trabajar con algunos métodos de los threads, pero aparte de que te simplifiquen el trabajo, debes conocer cómo van los threads, ya que me da la impresión de que no pueden solucionar TODAS las limitaciones de los threads. ¿A qué me refiero con esto? Antes de nada, debes saber que la VCL no es "Thread-safe"; Esto quiere decir, de forma simple, que no puedes acceder a elementos de la VCL desde 2 threads distintos de forma indiscriminada, o lo que es lo mismo; No puedes acceder a un elemento de la VCL del programa principal, desde un hilo. Tu procedimiento CortarArchivo accede a algunos elementos como Memo1, opc1, prBar,... que imagino (sigo con la bola de cristal adivinando) que están definidos en el formulario principal. Dado que la VCL no es "thread-safe", no puedes acceder a esos elementos directamente. ¿Esto quiere decir que no puedes usarlos? NO. Para poder acceder a esos elementos, los threads poseen el método Synchronize. Que lo que hace, es ejecutar un método del thread (que acceda a elementos de la VCL), asegurándose que que ningún hilo más (incluído el principal) accede a ellos durante ese periodo de tiempo. Por lo tanto, creo que los problemas del hilo, con la información que has colocado, está en el procedimiento CortarArchivo y en los accesos que haces. No se si en otros haces cosas similares. Espero haberme explicado medianamente bien. Un saludo.
__________________
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. |
#14
|
||||
|
||||
Otra cosa más, que tal vez es evidente, pero la comento.
La primera opción que se nos ocurre a veces es coger un gran trozo de código que ya tenemos, crear un hilo, copiarlo dentro y meterlo en un Synchronize. Eso funcionará, pero el problema es que TODO el código que esté en un Synchronize, se ejecuta de forma "bloqueante"; Es decir, por lo que he comentado antes, cuando se ejecuta un método que se llama desde un Synchronize, la ejecución del hilo prinicipal se detiene, para evitar problemas, por lo tanto si TODO el código de un hilo lo ponemos en un Synchronize NO ESTAMOS GANANDO NADA. Lo habitual es que las tareas del hilo "grandes" o "que ocupan la mayor parte del tiempo", se ejecuten en un proceso (sin Synchronize), y los métodos que se usan con Synchronize sean pequeños en tiempo de ejecución (normalmente para actualizar interface, como por ejemplo barras de progreso,...). Si buscas en los foros o si revisas mi web, encontrarás varios ejemplos de threads con código. Si los revisas verás cómo es la estructura y cómo se ejecuta el método Synchronize para actualizar componentes (progresos, labels,...) dentro del thread.
__________________
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. |
#15
|
||||
|
||||
Hola Neftali,
Perdona por tardar en contestar. Tienes razón, fue que mirando aquí y allí, y cogiendo un poco de esto y un poco de lo otro, salio un "guiso" amargo. Pondré en practica eso que dices de usar los threads solo para procesos menores (actualizar tal o cual componente). En cuanto a dejar el proceso que tarda mas tiempo fuera del hilo, imagino que al meter los procesos de la barra de progreso, el memo etc dentro del thread, también podre minimizar la ventana sin problemas ¿o estoy equivocado? no sé igual parece una tonteria, pero eso de no poder minimizar por que está todo "congelado" me desespera bastante y me refiero a mi aplicación. Lo de tu página la tengo en favoritos y me leere el tema de los dichosos hilos, la verdad es que me gustaría sino dominar su funcionamiento, al menos si poder trabajar con ellos sin problemas. Sobre lo de ser adivinos y tal, es culpa de mi desconocimiento del tema, conocer algo es la base para una buena explicacion o presentacion de un problema, y como no sabía como exponer bien el asunto con los hilos de marras, pues bueno... me expresé lo mejor que supe y pido disculpas si no fue suficiente. Bueno, dicho esto me pongo con el temita este a ver si lo aclaro ya. Muchas gracias y saludos a todos! |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Pasar cadena de conexion a tadoconnections dentro de un hilo de ejecucion | richy08 | OOP | 4 | 02-08-2010 23:49:32 |
como crear un hilo de ejecucion ayudenme plis!!! | jazmin | OOP | 4 | 21-06-2010 09:55:13 |
cuando llamo ejecutar un hilo dentro del proceso del hilo no lo hace | robertosc | Varios | 1 | 14-08-2007 22:11:09 |
Dudas Crear Objetos en Tiempo de Ejecución | Deiv | OOP | 9 | 09-08-2007 01:13:15 |
Parar un hilo de ejecución | deivi | Varios | 6 | 21-11-2006 13:36:49 |
|