Ver Mensaje Individual
  #11  
Antiguo 27-01-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Vuelvo a reiterar: Application.ProcessMessages no es programacion multi-hilo. No evita que tu programa se bloquee

Es un HACK (si, mayuscula, subrayado y negrita), es analogicamente comparable a una instruccion goto, a herencia multiple, etc.


En el único caso en el que te puede llegar a ayudar en algo (escribo esto muy a mi pesar..) es en un bucle que tarda mucho en ejecutarse (llamemosle tiempo total) pero que cada iteracion es razonablemente rapida

Por que? Considera este codigo (exagerado)

Código Delphi [-]
  for i := 1 to 100000000000000000 do
  begin
    j := j + i;
  end;

Si se ejecuta ese fragmento de codigo en un evento OnClick de un boton, hasta que no termina de ejecutarse la aplicacion esta tildada.

Código Delphi [-]
  for i := 1 to 100000000000000000 do
  begin
    j := j + i;
    Application.ProcessMessages;
  end;

El mismo codigo, pero ahora agregamos la linea magica al final del bucle. El hecho de sumar dos numeros es una operacion muy rapida, obviamente hacerla trillones de veces va a demorar algun tiempo; pero cada una sola operacion es rapida. Entonces, sumo un numero y luego proceso los mensajes que recibio la aplicacion; en este caso la aplicacion no va a parecer tildada

Ahora considera este codigo:

Código Delphi [-]
  Sleep(5000); // se duerme 5 segundos

Ja! ahi no tenes quien te salve. Donde pones el ProcessMessages?

Lo que te quiero decir es lo que comento mas arriba German: Si queres llamar procesos, o calcular valores intermedios que tardan cierto tiempo, abrir un query, etc; el ProcessMessages no te puede ayudar

Entonces lo ideal es aprender a utilizar threads. Es cierto, es muy dificil, pero para la gran mayoria de las tareas, si programamos bien, es relativamente sencillo

Sobre todo con las bibliotecas que he comentado mas arriba. Omni implementa el Async.Await que todos los chicos de .NET adoran; la System.Threading de XE7 tambien lo vuelve relativamente sencillo.

Y aunque dependas pura y exclusivamente de la clase TThread, tampoco es tan complicado

Tambien recorda que esta este foro para ayudarte

Yo creo que cuanto antes te subas al barco del multi-thread, mejor: adaptar un programa grande mas adelante para convertirlo en multi-hilo puede ser un hueso muy duro de roer. Y guste o no, es el futuro de la programacion. De nada sirve que la gente gaste dinero en procesadores multi-core si nosotros los programadores no los aprovechamos
Responder Con Cita