Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Dudas con Hilo en ejecución (https://www.clubdelphi.com/foros/showthread.php?t=84451)

danielmj 20-10-2013 21:47:40

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:

Código Delphi [-]
Procedure TPrincipal.Button1Click(Sender: TObject);
begin
  CortarArchivo(labEdit1.Text,2048);
end;

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.

Casimiro Notevi 20-10-2013 22:31:52

Ufff, creo que es más fácil un simple copia y pega del mensaje, ¿no crees? ;)
Cita:

[dcc32 Error] ZIZ.pas(784): E2010 Incompatible types: 'TThreadMethold' and 'procedure', untyped pointer or untyped parameter'

ecfisa 20-10-2013 22:46:40

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 :)

danielmj 20-10-2013 22:58:28

Cita:

Empezado por Casimiro Notevi (Mensaje 468690)
Ufff, creo que es más fácil un simple copia y pega del mensaje, ¿no crees? ;)

:o jaja es cierto, me complique mas de la cuenta. Saludos.

danielmj 20-10-2013 23:17:02

Hola ecfisa, saludos

mira..

Declaración del hilo...
Código Delphi [-]
...
private
{ Private declarations }
Thread: TStopStartThread;
WaitThread: TWaitThread;
UntilFlag: TEvent;
...

hago la llamada al hilo...
Código Delphi [-]
Procedure TPrincipal.Button1Click(Sender: TObject);
begin
  Thread.MsgWaitFor(CortarArchivo(labEdit1.Text,2048), nil); //---> Aquí me da el error o uno de los que posiblemente me vaya a dar.
  //CortarArchivo(labEdit1.Text,2048); --> esta linea esta operativa en este momento ya que el hilo  lo tengo "anulado" por no correr.
end;

Procedimiento "CortarArchivo"...
Código Delphi [-]
procedure CortarArchivo(sArchivo: TFileName; iLongitudTrozo: Long64 );
var
  i: Word;
  FS, Stream: TFileStream;
  nombreFile: String;

  label iniciar;

begin
  try
    principal.memo1.Lines.Add(CalcHash(principal.labedit1.Text,haSHA1));
    principal.Memo1.Lines.SaveToFile(principal.labEdit2.Text+ '\'+ extractFileName(principal.LabEdit1.Text+'.crc'));
  except
    on EFCreateError do
      begin
        showMessage ('Unidad seleccionada no válida. Selecciona una unidad' +
        chr(13)+'de disco duro local que sea accesible.');
        principal.Memo1.Text:= '';
        exit;
      end;
  end;

    if principal.opc1.Checked then
    begin
      iLongitudTrozo:= 1048576;        //1MB  --> los tamaños se muestran en Mbytes
      //sArchivo:= principal.LabEdit2.Text;

      FS := TFileStream.Create(sArchivo, fmOpenRead or fmShareDenyWrite);
    try
      principal.Memo2.Lines.Add((Chr(13))+(Chr(10)));
      principal.Memo2.Lines.Add('LISTADO DE ARCHIVOS [ORIGINAL CORTADO]');
      principal.Memo2.Lines.Add((Chr(13))+(Chr(10))+'·································');

      for i := 1 to Trunc( FS.Size / iLongitudTrozo ) + 1 do
      begin
        principal.prBar.Max:= FS.Size div iLongitudTrozo;
        principal.prBar.Position:= i;
        principal.prBar.Refresh;

        nombreFile:= extractFileName(sArchivo);
        try
          sArchivoPartido := ChangeFileExt(principal.labEdit2.Text +'\'+
          nombreFile, '.' + FormatFloat('000', i ) );
          Stream := TFileStream.Create(sArchivoPartido, fmCreate or fmShareExclusive);
        except
        on EFileStreamError do
        ShowMessage ('Unidad seleccionada no valida. Selecciona una unidad de disco duro local.');

        end;
          principal.labEdit2.SelStart:= 0;
          principal.labEdit2.SelLength:= length(principal.labEdit2.Text);
        if (principal.labEdit2.SelLength) = 3 then
            principal.Memo2.Lines.Append(principal.labEdit2.Text + extractFileName(sArchivoPartido))
        else
          principal.Memo2.Lines.Append(principal.labEdit2.Text+'\'+extractFileName(sArchivoPartido));

      try
        if fs.Size - fs.Position < iLongitudTrozo then
          iLongitudTrozo := FS.Size - FS.Position;
          Stream.CopyFrom( FS, iLongitudTrozo );
      finally
        Stream.Free;
      end;
  end;
  finally
  FS.Free;
  principal.Button1.Enabled:= false;

  principal.Memo2.Lines.Add((Chr(13))+ (chr(10)));
  principal.Memo2.Lines.Add('Archivo original: '+principal.LabEdit1.Text);
  principal.memo2.Lines.Add('Ruta destino: '+principal.labEdit2.Text);
  principal.Memo2.Lines.Add('Código HASH: '+principal.Memo1.Text);

  end;
    if principal.prBar.Max = principal.prBar.Position then
    principal.Timer1.Enabled:= true;
    Principal.lblTerminado.Visible:= true;
end;
...
    if principal.opc1.Checked then
    begin
      iLongitudTrozo:= 16106127360;        //15GB
      FS := TFileStream.Create( sArchivo, fmOpenRead or fmShareDenyWrite);
    try
      Principal.Label6.Caption:= IntToStr((FS.Size div iLongitudTrozo) +1);
      principal.Label6.Refresh;

      principal.Memo2.Lines.Add((Chr(13))+(Chr(10)));
      principal.Memo2.Lines.Add('LISTADO DE ARCHIVOS [ORIGINAL CORTADO');
      principal.Memo2.Lines.Add((Chr(13))+(Chr(10))+'·································');

      for i := 1 to Trunc( FS.Size / iLongitudTrozo ) + 1 do
      begin

        principal.prBar.Max:= Round((FS.Size / iLongitudTrozo));
        principal.prBar.Position:= i;
        principal.prBar.Refresh;

        sArchivoPartido := ChangeFileExt(principal.labEdit2.Text +'\'+
        nombreFile, '.' + FormatFloat('000', i ) );
        Stream := TFileStream.Create(sArchivoPartido, fmCreate or fmShareExclusive);

        principal.labEdit2.SelStart:= 0;
        principal.labEdit2.SelLength:= length(principal.labEdit2.Text);
        if (principal.labEdit2.SelLength) = 3 then
            principal.Memo2.Lines.Append(principal.labEdit2.Text + extractFileName(sArchivoPartido))
        else
          principal.Memo2.Lines.Append(principal.labEdit2.Text+'\'+extractFileName(sArchivoPartido));
      try
        if fs.Size - fs.Position < iLongitudTrozo then
          iLongitudTrozo := FS.Size - FS.Position;
          Stream.CopyFrom( FS, iLongitudTrozo);
      finally
        Stream.Free;
      end;
  end;
  finally
  FS.Free;
  principal.Button1.Enabled:= false;

  principal.Memo2.Lines.Add((Chr(13))+ (chr(10)));
  principal.Memo2.Lines.Add('Archivo original: '+principal.LabEdit1.Text);
  principal.memo2.Lines.Add('Ruta destino: '+principal.labEdit2.Text);
  principal.Memo2.Lines.Add('Código HASH: '+principal.Memo1.Text);
  end;
    if principal.prBar.Max = principal.prBar.Position then
    principal.Timer1.Enabled:= true;
    Principal.lblTerminado.Visible:= true;
  end;
end;

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.

danielmj 21-10-2013 11:56:45

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:

Código Delphi [-]
type
  TData = record
  Codigo: integer;
  Nombre: string;
end;

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"

Código Delphi [-]
procedure TJoin.ThreadExample(Data: pointer);
begin
  CoInitialize(nil);
  UnirArchivo(labEdit1.Text,labEdit2.Text);
end;

Bueno, esa es la solución. Espero que le sirva a alguien.
Saludos.

ecfisa 21-10-2013 11:58:33

Hola danielmj.

Gracias por presentarnos la solución ^\||/

Saludos :)

danielmj 21-10-2013 13:22:18

bueno, bien o mal explicado, creo que puede ayudar a alguien o eso espero. En cuanto al hilo, ya está corriendo :D

saludos.

danielmj 22-10-2013 23:26:21

Hola nuevamente,
Parece que no es oro todo lo que reluce... y digo esto por que si bien el hilo ya corre, cuando pulso el botón para salir (o matar al hilo), no hace ni caso y el proceso sigue...

Este es código que tengo puesto para cortar el hilo definitivamente y salir de la aplicacion:
Código Delphi [-]
if Assigned(WaitThread) then WaitThread.AbortThread;
    if Thread.Waiting then Thread.AbortThread;
    begin  
      thread.Terminate;
      WaitThread.Terminate;
      FreeAndNil(thread);
      Thread.Free;
      UntilFlag.Free;
   end;
close

¿que hago mal?

Saludos y gracias.

Casimiro Notevi 23-10-2013 00:42:02

No sé que otras cosas harás mal, pero esto sí que está mal:
Código Delphi [-]
FreeAndNil(thread);
thread.Free;

Con FreeAndNil liberas la memoria ocupada y la pones a nulo. Luego con Free ... ya no hay nada que liberar, en teoría.

danielmj 23-10-2013 00:57:25

Gracias por el apunte casimiro, soy de los que piensa que hay que ser humilde en todos los aspectos de la vida de ahí que sepa reconocer mis errores. Es por eso que os pido consejo sobre tal o cual código, afortunadamente son pocas las otras cosas que hago mal, y aunque la programacion no me vaya a dar de comer (es mas una aficion) el trabajar de 7 de la mañana a 8 de la tarde en un torno paralelo o en la centina de un remolcador, si se me da bien desde hace ya 25 años.
una vez mas gracias por tu comentario lo estudiare y lo pondre en practica a ver que tal.

Casimiro Notevi 23-10-2013 01:13:43

¿Y trabajas de tornero en la sentina de un remolcador?

danielmj 23-10-2013 01:24:14

:) si te fijas en mi anterior texto use "o" para referirme a una cosa u otra, es decir dicho de modo facilmente entendible, a veces el trabajo exige que este 12 horas de pie en el torno y otras que este doblado como un 8 entre tuberias de gasoil, aceite hidraulico etc en la sentina de un barco o en la sala de maquinas de este. Y no sabes como de reventado se llega a casa... pero es lo que hay. La programacion en mi caso es mas una especie de terapia de desconexion del dia a dia y si encima aprendo pues mejor. Saludos.

Casimiro Notevi 23-10-2013 01:47:20

Sí, es un trabajo duro.

nlsgarcia 23-10-2013 02:12:42

danielmj,

Cita:

Empezado por danielmj
...La programación en mi caso es mas una especie de terapia de desconexión del día a día y si encima aprendo pues mejor...

^\||/ #:-)#

Nelson.

danielmj 23-10-2013 20:24:30

Saludos y vuelta con lo mismo...

He modificado el código como me sugería casimiro (lo que ahora no sé es si le entendí bien), el caso es es que el código queda así...
Código Delphi [-]
try
    if Assigned(WaitThread) then WaitThread.AbortThread;
      if Thread.Waiting then Thread.AbortThread;
        thread.Terminate;
        close
  except
    thread.Free;
  raise
  end;

Añado que esta modificación la hago en base a una discusión en stackoverflow que encontré no hace ni media hora. Dicho esto, cuando pulso sobre "cerrar" el formulario se cierra pero en segundo plano el hilo sigue corriendo, si pulso la "X" de cerrar me tira este error (ver captura). Si vuelvo a pulsar la "X" parar cerrar el formulario "a las bravas" se repite el mismo mensaje de error y ya luego si se cierra todo y sale del programa.

Mensaje de error 1:


Mensaje de error2 (lo muestra si pulso "continue" en el primer error):


Entonces, ¿de que forma se detiene correctamente un hilo que se esta ejecutando en el momento de detenerse?

P.D.: Saludos nelson, me alegra que estes de acuerdo con mi afirmación :cool: aunque veces la terapia me crispa los nervios jaja.

Casimiro Notevi 23-10-2013 20:37:01

Cita:

Empezado por danielmj (Mensaje 468877)
He modificado el código como me sugería casimiro (lo que ahora no sé es si le entendí bien), el caso es es que el código queda así...

je, je... aunque yo solamente comenté que sobraba el thread.free, porque ya lo habías liberado en la línea anterior con freeAndNil(thread) :)

danielmj 27-10-2013 15:37:17

hola a todos,

sigo con lo mismo, parece que se corta el hilo pero sigue con el proceso en segundo plano. ahora el código solo tiene

Código Delphi [-]
thread.terminate;
thread.freeOnterminate:= true;

Pero como digo, sigue con el proceso de unir el archivo en segundo plano, y cuando pulso la "x" para salir del formulario, me tira dos mensajes de error como las capturas de mas arriba.

¿alguna idea?
Gracias.

danielmj 27-10-2013 19:28:41

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...

Código Delphi [-]
FORMULARIO PRINCIPAL
           BOTON1 --> LLAMA AL FORMULARIO CORTAR
           BOTON2 --> LLAMA AL FORMULARIO UNIR 
           BOTON3 --> SALIR
               CODIGO BOTON3 --> "close"

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.

Casimiro Notevi 27-10-2013 20:08:22

No somos adivinos ni tenemos una bola mágica. Creo que ya has leido nuestra guía de estilo, pues eso :)

danielmj 27-10-2013 20:35:36

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:

Formulario principal
+Boton Cortar
+Boton Unir
+Boton Salir
+Código botón salir --> "Close"
El error lo da nada mas cargar la aplicacion, es decir sin haber ejecutado nada dentro del código cortar o unir. Simplemente aparece el formulario principal, pulso salir y ya tira el error. Evidentemente como dice casimiro, nadie es adivino, pero con que me deis una sugerencia de por donde creeis que puede venir ese error me vale. Espero que ahora quede todo más clarito.

Gracias.

Casimiro Notevi 27-10-2013 21:40:51

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.

danielmj 27-10-2013 23:23:54

hola,

aqui pongo el codigo de toda la unidad del formulario principal, desde el que se hace la llamada a los otros formularios:

Código Delphi [-]
unit main;

interface

...

type
  TInicio = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Inicio: TInicio;

implementation

{$R *.dfm}

uses ZIZ, Unir;

procedure TInicio.Button1Click(Sender: TObject);
begin
  principal.Show; //Modal;
end;

procedure TInicio.Button2Click(Sender: TObject);
begin
  join.Show; //Modal;
end;

procedure TInicio.Button3Click(Sender: TObject);
begin
  close
end;

end.

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.

blackx5n 28-10-2013 05:21:34

Hola, segun el codigo que pones no veo que halla algun error.

1- Solo te da error en el boton de salir
2- Te fijastaste que nombre de los formularios y sus unidades sean los correctos.
3- En los formularios o en los botones no habras modificaddo alguna propiedad en el Object Inspector que te cause este error.
4- Que mensaje de error te da.

Hice la prueba con un formulario y coloque 3 botones y agrege 2 formularios llame en los primeros 2 botones al formulario 2 y 3 y el boton 3 salir no me da ningun error.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses unit2,unit3;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form3.Show;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;

end.

Salud2

Al González 28-10-2013 06:13:18

Compilar con Use Debug DCUs.
Revisar finalización de ZIZ y Unir.
Posible objeto Nil.

danielmj 28-10-2013 20:35:16

Hola saludos,

antes de nada, gracias por responder y dar vuestras sugerencias. Dicho esto, os diré que ya di con el error y lo tengo solucionado pero a sacrificio de una parte importante de la aplicacion.
Lo que he hecho es volver a instalar la version trial de EurekaLog, pensé que quizás capturaría el error y al menos tendría algo por donde centrar mi atención, bien el resultado es este:


Como veis en la captura, he marcado la unidad "unir" que es la que me causaba el error.

La solucion: Antes dije que habia tenido que sacrificar una parte importante de la aplicación, y esta ha sido anular por completo la ejecucion de los procesos dentro de un hilo. Es decir, he anulado por completo todas y cada una de las líneas que hacían mencion al Thread y el error se ha solucionado.

Conclusión: Ahora va bien no da errores pero no puedo ni minimizar la ventana mientras está corriendo, con lo cual tendré que volver a plantearme como usar correctamente los hilos (cosa que por cierto no tengo ni idea y por mucho que leo se escapa a mi comprensión).

Bueno, no sé si esto podrá ayudarle a alguien en algún momento, pero ahí queda.
Saludos y una vez mas, gracias.

danielmj 28-10-2013 20:40:47

Hola buenas,

En otro post he mostrado cierta informacion sobre el error que me daba la aplicacion tan solo al salir de la misma, el error tenía que ver con los hilos. Sinceramente ya no sé como hacer para usar estos en el código, por lo que agradecería toda la informacion (a ser posible en español) referente a esto, a ver si así estudiandolo y leyendo me aclaro con ello y puedo usarlos sin mayores pegas.

Un saludo.

Neftali [Germán.Estévez] 29-10-2013 10:21:16

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:
Código Delphi [-]
private
{ Private declarations }
Thread: TStopStartThread;
WaitThread: TWaitThread;
UntilFlag: TEvent;
...

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.

Neftali [Germán.Estévez] 29-10-2013 10:29:03

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.

danielmj 31-10-2013 18:02:31

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!

Neftali [Germán.Estévez] 31-10-2013 19:52:54

Cita:

Empezado por danielmj (Mensaje 469148)
(1) Pondré en practica eso que dices de usar los threads solo para procesos menores (actualizar tal o cual componente).
(2) 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.

Perdona. Tal vez no me he explicado bien, porque esto que comentas no es lo que quería decir.

(1) Los threads puedes usarlos para todo tipo de procesos, sean costosos o no. El hecho de poner algo dentro del hilo te permite que el programa no tenga que esperar a que ese proceso acabe y pueda continuar haciendo otras cosas.

Dentro del hilo hay cosas que se ejecutan en el RUN (es la ejecución propia del hilo) y cosas que se ejecutan usando SYNCHRONIZE (también dentro del hilo, pero usando este método).
Lo que interactue con elementos de la VCL o con "cosas" que tengas definidas fuera del hilo, deben hacerse mediante SYNCHRONIZE, el resto del proceso en el RUN.

(simplificando mucho)

Un saludo.


La franja horaria es GMT +2. Ahora son las 10:53:08.

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