Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-12-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Información sobre hilos de ejecución

Hola, quiero mirarme como funcionan y como se crean los hilos de ejecución, he encontrado cosas en internet, pero no me aclaran mucho, ¿sabeis alguna explicación completa y digamos que didactica para comprender como funcionan y como se crean? La verdad es que tengo varios programas hechos por mi, que practicamente están terminados pero consumen muchos recursos y claro llega un momento en que se cuelgan, y quería retomarlos y meter los procesos mas pesados dentro de hilos. un saludo.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #2  
Antiguo 04-12-2014
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
No está mal que quieras aprender a usar hilos de ejecución, pero lo primero que debes tener en cuenta es que no siempre es mejor. Es decir, dices que tu programa se cuelga porque usa muchos recursos: hacer que funcione en otro hilo no tiene por qué solucionar el problema. A veces (casi siempre, en mi experiencia) la solución es otra (mejor uso de la memoria, por ejemplo).

Pero como digo, no está mal que quieras aprender a usar hilos porque son útiles en muchas ocasiones, así que ahí va.

Lo más simple es usar la clase TThread. Es bastante simple: hay que extender la clase TThread para añadirle las propiedades (datos) que necesite, e implementar el método "Execute", que es el código que se ejecutará en paralelo. Aquí tienes un ejemplo sencillito para iniciarte. Es algo viejo (de 2008), pero dudo que haya cambiado mucho la cosa. También tienes esta conversación en la que se habla del tema.

Espero que te ayude a empezar.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 04-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
danielmj,

Cita:
...Información sobre hilos de ejecución...¿sabéis alguna explicación completa y digamos que didáctica para comprender como funcionan y como se crean?...


Revisa este link:
Espero sea útil

Nelson.
Responder Con Cita
  #4  
Antiguo 04-12-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
buenas,

gracias voy a revisar a ver que tal se me da, lo que he leido hasta ahora se me escapa un poco pero bueno, lo he leido mas o menos por encima sin detenerme mucho.
Un saludo.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #5  
Antiguo 04-12-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola,

Bueno ya he empezado a experimentar con hilos, he implementado un hilo a una aplicacion que ya tenia hecha y he conseguido que corra, pero en un momento dado, no siempre el mismo, me tira este error...


Sé que el error no se da en el mismo momento siempre, por una barra de progreso, a veces se rellena mas y otras menos, antes de tirar el error. También he agregado al programa la unidad SynchedThreads, que si no me equivoco (y si estoy en un error que alguien me corrija) es para sincronizar la vcl, creo.

El error me marca la linea 246, y esa linea tiene este codigo:
Código Delphi [-]
procedure TThread1.Execute;
var
begin
...
form1.button4.enabled:= true;
...
end;

Por cierto, como veis el mensaje de error sale en español, esto es por que es lazarus, sé que hay una seccion para lazarus en el foro, pero entre que empece el hilo sobre delphi y que el código es igual, me pareció acertado ponerlo aquí, si está mal que algún administrador lo mueva.

En fin ¿alguien sabe este error a que obedece?
Un saludo y gracias.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #6  
Antiguo 05-12-2014
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por danielmj Ver Mensaje
Hola,

Bueno ya he empezado a experimentar con hilos, he implementado un hilo a una aplicacion que ya tenia hecha y he conseguido que corra, pero en un momento dado, no siempre el mismo, me tira este error...

(...)
Pregunto: ¿Has hecho programas de prueba, más simples, antes?

Ten en cuenta que una aplicación que funcione con hilos necesita una planificación diferente que las aplicaciones que no los usan. Principalmente, en el acceso a memoria. Es posible que en algún punto uno de los hilos intente acceder a alguna variable u objeto de otro hilo diferente sin realizar la necesaria comprobación de sincronización, lo que puede ser la razón por la que salte el error en momentos deferentes. Lo más complicado es cuando hay ventanas/formularios implicados. Hay que estar seguro de en qué hilo se crea para asegurarse de hacer la sincronización adecuada de ser necesario.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #7  
Antiguo 05-12-2014
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.289
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 danielmj Ver Mensaje
Código Delphi [-]
procedure TThread1.Execute;
var
begin
...
form1.button4.enabled:= true;
...
end;
Bueno, viendo esa línea te diría que es normal el error.
Hay que tener claro que la VCL de por sí, no es "Thread-safe". Eso se traduce en que desde dentro de un hilo no puedes acceder "alegremente" a componentes y código que tengas fuera de él.

Es decir, desde dentro del hilo, NO PUEDES llamar "directamente" a un botón del formulario (Form1.Button4.Enabled).

Lo ideal es que los hilos se utilicen para relizar procesos que no inviolucren elementos visuales, como son formularios, componentes,...
Está claro que en algunos casos debemos modificarlos, por ejemplo, una barra de progreso para indicar el estado, labels, o si es el caso, el botón4 del form1.
Si esto es necesario, está contemplado y para ello está el método Synchronize.

Como te he dicho la VCL no es "thread-safe" por lo tanto tenemos que asegurarnos que cuendo accedemos desde el thread a "elementos externos" lo hagamos de forma exclusiva. Para eso sirve el Synchronize.

Aquí tienes algún ejemplo:

Y aquí en mi página un par más:
http://neftali.clubdelphi.com/?p=146
http://neftali.clubdelphi.com/?p=149

Me centro en estos ultimos para explicarte lo que más arriba apunto.

En el primero de los ejemplo, hay varios componentes del fiormulario que se deben modificar (similar a lo que haces tú con el edit).
Verás que en el thread NO SE LLAMA directamente a este código:

Código Delphi [-]
  // Incrementar un progressbar del formulario
  pb.Position := (pb.Position + FStep) MOD 100;

O a este otro:

Código Delphi [-]
  // Cambiar el color de un panel del formulario
  FColor := RGB(Random(255), Random(255), Random(255));
  pnb.Color := FColor;

Hay que colocarlos en un procedimiento y llamarlos con el método anterior; Así el código resultante es algo así:

Código Delphi [-]
procedure TPanelColorThread.ChangeColor;
begin
  FColor := RGB(Random(255), Random(255), Random(255));
  pnb.Color := FColor;
end;

...

  // La llamada
  while true do begin
    Synchronize(ChangeColor);
  end;

Y en el caso del progressbar, es algo similar.
__________________
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
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
Crear Hilos de Ejecución con TIdFTP JAI_ME Varios 12 13-12-2013 18:28:39
Ayuda con Hilos de ejecucion kurono Varios 19 15-01-2011 15:36:40
Problema con hilos de ejecucion gueritox OOP 1 14-08-2010 15:26:06
Hilos de ejecucion el toluca Varios 2 29-06-2004 22:59:04


La franja horaria es GMT +2. Ahora son las 23:39:47.


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