Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-04-2006
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb Detener ejecucion de programa

Hola, estoy realizando un programita en el que aparecen varios formularios que se usan durante la ejecución pero me preguntaba si es posible agregar un botón para detener la ejecución del programa y lo hice, solo que los formularios no me permiten oprimir dicho botón durante la ejecución, es decir que tienen prioridad y no sé como hacer que se me permita utilizar el botón de "detener" mientras el programa se esta ejecutando. Espero me puedan ayudar resolviendo mi duda, de antemano muchas gracias
Responder Con Cita
  #2  
Antiguo 25-04-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Hola Luli, para poder ejecutar eventos del tipo apretar un botón, mientras el programa está ejecutando (no lo indicas, pero suponemos que es un bucle), dentro de ese bucle debes añadir la siguiente linea:

Código Delphi [-]
Application.ProcessMessages;

Esto hará dos cosas:
- Evitar que se congele tu aplicación
- Permitir que puedas ejecutar otros eventos.

Espero te sirva.

Saludos
Responder Con Cita
  #3  
Antiguo 30-04-2006
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb No entiendo el uso de application.processmessages

Hola muchas gracias por responder. Puse la línea de código que me indicó dentro del ciclo, pero sigue sin permitirme oprimir ningún botón hasta que se termina la ejecución del programa. Los que se muestran son formularios y showmessages. No entiendo como es que funciona application.processmessages entonces voy a leer acerca del uso de esa linea de codigo, gracias por el dato.
Responder Con Cita
  #4  
Antiguo 01-05-2006
JCarlosas JCarlosas is offline
Miembro
 
Registrado: abr 2006
Ubicación: Habana. Cuba
Posts: 103
Poder: 19
JCarlosas Va por buen camino
Hola Luli.
Mira prueba adicionando varios
Application.ProcessMessages; seguidos de sleep(100);
Que Sucede???
La rutina Application.ProcessMessages;Lo que hace es decirle a Windows que procese los mensajes que tene en la cola de mensajes. Al ponerlo solo una vez puede que el mensaje que tu necesitas que se procese no tenga tiempo de procesarse por Windows, por tanto no te hara nada.La inclusion del sleep(100), lo que hace es exactamente eso, poner a dormir a tu aplicacion por 100 milisegundos, dandole asi tiempo a Windows a que procese los mensajes que tiene en la cola, donde supuestamente ya debiera estar el tuyo.Esto a mi me ha funcionado en la mayoria de las veces que lo he hecho, cuando un solo Application.ProcessMessages; no me ha resultado.O sea lo que he puesto es algo asi.
Código Delphi [-]
Application.ProcessMessages;
sleep(100);
Application.ProcessMessages;
sleep(100);
Application.ProcessMessages;
sleep(100);
Por supuesto que esta solucion no es muy profesional y ni siquiera a mi me agrada, pero funciona en la mayoria de las veces (No el 100%) como te comente.Tiene como inconveniente que te inserta una demora adicional a tu procesamiento y si lo haces dentro de un ciclo muy largo(for i=0 to 1000000), el tiempo de procesamiento se te elevaria demasiado.Quizas pudieras bajar el valor del sleep de 100 a uno mas bajo para que sea mas eficiente o subirlo un poco si no te agarra el mensaje.Bueno espero que tu caso caiga dentro de los que se resuelven con esto.
Saludos
Juan Carlos

Última edición por JCarlosas fecha: 01-05-2006 a las 14:33:36.
Responder Con Cita
  #5  
Antiguo 01-05-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Si acaso estas realizando un proceso bastante "gordo" quizás fuera mejor el uso de hilos (Threads), de esa forma se crea un proceso casi independiente del Form, permitiendo el uso de botones.

Es lo que suele hacerse en las búsquedas de Ficheros, por ejemplo.

SAludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 01-05-2006
JCarlosas JCarlosas is offline
Miembro
 
Registrado: abr 2006
Ubicación: Habana. Cuba
Posts: 103
Poder: 19
JCarlosas Va por buen camino
Hola Junior.
Si tienes a mano algun ejemplo sencillo de como hacerlo de esa forma te lo agradeceria, pues una vez intente hacerlo por hilos independientes como planteas y se me armo un rollo que termine desechando la idea pues no supe hacerlo.
Pero efectivamente esa creo que seria la mejor solucion. Claro no la mas sencilla


Saludos y gracias de antemano.
Juan Carlos
Responder Con Cita
  #7  
Antiguo 02-05-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Hola Juan Carlos, muchas gracias por lo de Junior, me has alegrado el día .

Lamentablemente no tengo un ejemplo sobre threads, pero
mira en tu carpeta delphi\demos\threads, allí tienes uno.

La filosofía es mas o menos así:
-Defines la Clase TMihilo = Class (Thread)

- Defines al menos el método Create, si usas el estandard de un Thread, te pide una variable booleana Suspended, Si la pones a true,quiere decir que al crear el Thread, se quedará "suspendido" y tienes que llamar al método Execute para poner en marcha el proceso largo.

- Defines el método Execute, que es donde tendrás todo el proceso "gordo", definiendo una condición de salida if Terminated then Exit, esto significa que si el Thread ha terminado (que salga de ese bucle inmediatamente). Puede ocurrir que el usuario pulse la X para cerrar la ventana, pero los threads se estan ejecutando, así que en el evento OnClose de tu ventana pones Mihilo.Terminated := true; que obligará a finalizar el Thread.

- Si dentro del Thread necesitas actualizar un Label del Form, no puedes hacerlo con un simple Form2.Label.Caption := 'bla blah' precisamente porque es un hilo independiente y puede estar totalmente desincronizado con el Form1; para hacerlo, tienes que crearte un procedure dentro del hilo, en ese ejemplo se llama DoVisualSwap y dentro de esa rutina si llamas a Form2.Label.Caption := 'bla blah' cuando quieras actualizar el label llamas al procedimiento con syncronize(DoVisualSwap). Esto es así por definición de los Threads, no tiene más explicación .

Si te surgen algunas dudas, puedes comentarlas aquí.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 02-05-2006
JCarlosas JCarlosas is offline
Miembro
 
Registrado: abr 2006
Ubicación: Habana. Cuba
Posts: 103
Poder: 19
JCarlosas Va por buen camino
OK, muchas gracias.
En cuanto termine algunas rutinas pendietes de alta prioridad re-hare esa parte del codigo.
Saludos
Juan Carlos
Responder Con Cita
  #9  
Antiguo 04-05-2006
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Smile Gracias

Hola a todos, muchas gracias por responder. Empezaré por probar con la línea de sleep(100), yo creo que funcionará. Nuevamente gracias por el tiempo, nos vemos pronto por aqui, bye.
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
Problemas con la ejecucion del programa daly Varios 4 18-10-2005 14:39:06
Bloquear la ejecución de un programa. alfredosg19 Varios 2 19-03-2005 18:17:47
Ejecucion de Programa en Kylix karimnot Lazarus, FreePascal, Kylix, etc. 1 03-09-2004 21:33:28
Ejecucion de un programa en una PC silviodp Varios 3 23-01-2004 01:53:09
programa en ejecucion??? Tanix Varios 2 11-12-2003 14:15:39


La franja horaria es GMT +2. Ahora son las 19:16:38.


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