Ver Mensaje Individual
  #4  
Antiguo 29-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Reputación: 20
cHackAll Va por buen camino
Cool No problem...

Cita:
Empezado por jarlos
...cuando cargo data con muchos detalles, la aplicación [n]se paraliza[/n]...
Bueno amigo jarlos... lo que sucede es bastante simple, y te lo explico; la librería que está dando soporte al .AVI (el que te permite verlo) es la winmm.dll mediante la unidad MMSystem del Delphi (si estas utilizando DirectShow es prácticamente el mismo caso)… éstas librerías son solo una interfaz que permiten al codex adecuado (como su nombre lo dice), poder decodificar el formato del .AVI y así producir los frames (cuadros de imágenes consecutivos), de video y sonido. Para realizar dichas operaciones; éstas librerías crean un grupo de hilos en el proceso que así lo solicita indirectamente. Lo que significa que tu hilo principal (el que maneja tu ventana), mientras anda ocupado comunicándose vía OLE al motor de la BD (y que en dicha acción ni si quiera le permite procesar los mensajes para refrescar la ventana), los hilos creados por el sistema multimedia se encargan de permitir al usuario visualizar el video como si estuviese “separado” del proceso afectado.

Y bueno, sin intentar dar mas vueltas en la causa, te adjunto la solución que está basada en la creación de un hilo, el cual a su ves crea una ventana del cual los mensajes son procesados en el mismo. Lo que responde exactamente a aquellos problemas causados por un hilo principal “ocupado”. El modo de empleo es simple;

Código Delphi [-]
var Rect: TRect;
begin
 Rect := BoundsRect;
 BusyStatus('Sistema ocupado, por favor espere...', @Rect);
...

Procura que la función BusyStatus sea llamada justo antes del inicio del problema, el la misma unidad "detectará" cuando debe "ocultarce", y si quieres utilizar la unidad en otros momentos te sugiero que lo utilices (por ejemplo) al momento en que esta en plena creación tu aplicación:

Código Delphi [-]
  BusyStatus('Inicializando el sistema...');
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm5, Form5);
  Application.CreateForm(TForm6, Form6);
…
  Continue;
  Application.Run;

"Función Continue, creada para aquellas aplicaciones que no utilizan GUI o cuando no funciona por no tener controles, o simplemente para asegurar un funcionamiento adecuado"

De seguro será de utilidad y una base para solucionar otro tipo de problemáticas de la misma índole.

Saludos!
Archivos Adjuntos
Tipo de Archivo: zip _Busy.zip (1,5 KB, 113 visitas)
Responder Con Cita