![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
|||
|
|||
|
Mira roman:
Para poder hacer lo de la barra de progreso necesitamos que el procesador de la computadora valla ejecutando ambos hilos a la vez, es decir el progress bar y el montaje de la bases de datos o tablas o lo que fuese... Para esto debemos darle la mayor priridad al montaje, pues es quien le indica al procesador cuando debe cambiarse hacia el otro hilo. De esta manera se ejecutaran ambos prosesos, claro que se puede hacer (los sistemas operativos lo hace, tambien toda clase de aplicaciones). El mayor problema radica en sincronizar ambos hilos, para esto debemos saber cuando necesitamos ejecutar uno u otro, pero esto depende de la aplicacion que estemos haciando y de lo que realmente necesitemos... Los puedo ayuda con el codigo del progress bar y del hilo del mismo, pero lo otro es problema de ustedes, pues ahora mismo no tengo tiempo, asi que mañana les mandare como hacer lo que les explico. Esto no es tan sencillo pero es una idea generar, talvez con esto resuelvan su problema... Saludos a todos y gracias por solicitar mi ayuda. Saludos de nuevo. xelip |
|
#2
|
|||
|
|||
|
Hola,
Talves mi explicacion anterior sea un poco comlicada, perdonen, pero realmente escribo de nuevo para aclarar algo... Cuando ramon me decia que se necesitaba que lo que fueramos a cargar fuera por pasos es algo muy logico, pero solo si por cada paso incrementariamos la barra, pero para mi esto es innecesario, pues bien, no importa cuanto tiempo demore en cargar las tablas los mas importante es que el procesador pueda ser capaz de llevar ambos procesos siempre que tengamos un aproximado del tiempo de duracion de la carga...Ahora, si no tuvieramos un tiempo muy confiable podriamos solo poner el incremento de la barra y no el que porciento de esta, cuanto queda, o cosas por el estilo. xelip Última edición por xelip fecha: 27-08-2006 a las 21:16:23. |
|
#3
|
||||
|
||||
|
Que ganas tienes de liarte con hilos, no dudo que de alguna forma que seguro es extraña se pueda conseguir, pero estamos hablando de informar con algo al usuario para que se de cuenta que la aplicacion no se ha quedado colgada. Para ello basta con una animacion (gif) o estimas cuanto tiempo tarda en cargarse la tabla y metes la barra de progreso con un timer, si tarda menos pues no pasa nada, y si tarda mas la pones a 0 y la llenas otra vez, que la final lo unico que quieres es que el usuario vea que algo se mueve.
Un saludo. PD: Xelip tengo curiosidad por saber como se ve el estado en que se encuentra la apertura de la tabla. PD2: Se me acaba de ocurrir que si lo que haces es cargar los registros en algun sitio mires el numero de registros y cada x registros incrementes la barra de progreso, pero creo que no haces eso.
__________________
Intentando hacer algo con Delphi 7 y Firebird 1.5 |
|
#4
|
|||
|
|||
|
Hola a todos:
Siento no haber podido responderles antes, pero es que he estado un poco complicado con los studios, pero lo prometido es deuda, aqui tienen un ejemplo de como hacer lo del progress bar (sin multi hilos), esto se lo debo a mi padre, yo no sabia como hacerlo sin multi hilos... windows es un sistem orientado a eventos, un evento es una accion relacoionada a un componente/control hay componente visules( ventana, boton, imagen...) y no visulales( un Objecto, uuna Lista , una collection) Cuando ocurre un evento ( mousemove, mouseclick, kepressed, changefocus.........) se crea un mensaje que se pose en la colas de mensajes, cada mensaje dice a quien va dirigido ( a que applicaion) un click de mouse en un docuemto word genera un mensaje WM_MOUSECLICK (WM_ windowsMessage) dirigdo a word, cada applicacion va revisando medinate un ciclo intermo si tiene un mensje en la cola y si lo tiene lo coge y ejecuta la accion corespondiente al mensaje, digamos en este ejemplo deplegar un menu. Si una applicacion se dedica durante mucho tiempo a realizar un proceso de calculo y no revisa la cola de mensajes entonces queda como congelada porque no realiza las operaciones relacionas a sus mensajes, sino que solo se dedica a relizar el caculo. una pplicaion de windows es algo asi crea ventana regrista ventana muestra ventana repeat lee cola de mensajes case mensaje of WM_MOUSECLICK : ejecuta OnMouseClick; WM_MOUSEMOVE : ejecuta OnMouseMove; WM_KEYPRESSED : ejecuta OnKeyPressed; WM_BUTTONCLICK : ejecuta OnButtonClick; .............. WM_CLOSEWINDOW : ejecuta OnCloseWindows // cierra el programa end; until true = false // ciclo infinito esta parte de la implemetacion de un programa windows esta "oculta" pero en un inicio si habia que programarla actulamente solo se programan los eventos, es decir tu pones un botton y programas en evento OnButtonClick entonces si dentro del codigo del OnButtonClick yo hago esto prodedure OnBttonClick( Sender.... var A begin while true = false do // ciclo infinito begin A := 1; end; end; cuando haga click en el botton la applicacion se congela porque nunca saldra del ciclo, pero si escribo prodedure OnBttonClick( Sender.... var A begin while true = false do // ciclo infinito begin Application.ProcessMessages; A := 1; end; end; entonce la application no se congela porque antes de cada iteracion va la cola toma sus mensajes y ejecuta las acciones relacionadas a sus eventos, esto incluye refrecar las ventanas, WM_PAINT, tambien WM_INVALIDATE, invalidate obliga a una ventana ( control) a repintarse/refrescarse porque su estado ha cambiado y dejo de ser valido lo que esta mostrando esto lo ordenas con el metodo Refresh, esto le envia un mensaje a uina ventana diciendole que se repinte, ejemplo cuando un botton esta arriba y se hace click y se deja el mouse presionado, windos le envia un invalidate al botton para que pinte abajo y cuando se libera el mouse windoes le envia un nuevo invalidate para que se pinte arriba con el Progressbar seria prodecure Calcula; var n : longint; begin ProgressBar.Min := 0; ProgressBar.Max := CantidaOperaciones; ProgressBar.Pos := 0; Application.ProcessMessages; for n := 0 to CantidaOperaciones do begin ProgressBar.Pos := n; Application.ProcessMessages; EjecutaOperacion; end; end; si el procedimeto EjecutaOperacion toma mucho tiempo porque reliza calculos muy intensivos/complicados que tomman mucho procesador se puede considerar opcionalmente intercalar unos ProcessMessages dentro del codigo, esto permite revisar la cola de mensajes durante la ejecucion de EjecutaOperacion. procedure EjecutaOperacion; begin Application.ProcessMessages; //opcional ....... Application.ProcessMessages; //opcional ...... Application.ProcessMessages; //opcional ...... Application.ProcessMessages; //opcional ...... Application.ProcessMessages; //opcional end; que pasa si demora mucho y queremos cancelarlo, en este caso agragamos un botton Cancelar y agregamos OnClick procedure CancelarClick.... begin VariavleGlobalCancelar := True; end prodecure Calcula; var n : longint; begin ProgressBar.Min := 0; ProgressBar.Max := CantidaOperaciones; ProgressBar.Pos := 0; VariavleGlobalCancelar := False; // Application.ProcessMessages; for n := 0 to CantidaOperaciones do begin if VariavleGlobalCancelar then Break; // el usuario hizo click en botton cancelar ProgressBar.Pos := n; Application.ProcessMessages; EjecutaOperacion; end; end; Espero que esto les sirva un poco para lo que estan haciendo. saludos... ,xelip. |
|
#5
|
||||
|
||||
|
Sí vamos. ProcessMessages es algo más o menos conocido por todos y varios tenemos una idea bastante buena de cómo funciona Windows y sus mensajes. Pero parece que no leíste con detenimiento ni la pregunta original ni las respuestas. Desde el mensaje 9 comenté porque no es posible poner una barra de progreso en el caso particular de lo que se pregunta. El ejemplo que pones ahora no aplica por lo que ya se comentó anteriormente: no puedes subdividir en pasos la apertura de una tabla.
// Saludos |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Cerrar Splash Imposible ... | serhasae | Varios | 9 | 09-10-2007 21:27:18 |
| Splash Screen | jmedina | Varios | 6 | 15-08-2007 07:15:46 |
| Problemas en splash screen | ilichhernandez | Varios | 2 | 19-12-2005 06:45:17 |
| Splash Screen con imagen | ibstk | Varios | 2 | 09-09-2004 01:05:51 |
| Hacer un Splash con forma de una imagen | rjsitruiz | Gráficos | 6 | 09-07-2004 11:28:21 |
|