Comunidad Gambas-es
[SOLUCIONADO] ¿Lanzar aplicación Gráfica un hilo que opere para la aplicación principal? - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forumdisplay.php?fid=3)
+--- Foro: General (https://gambas-es.org/forumdisplay.php?fid=4)
+--- Tema: [SOLUCIONADO] ¿Lanzar aplicación Gráfica un hilo que opere para la aplicación principal? (/showthread.php?tid=461)



¿Lanzar aplicación Gráfica un hilo que opere para la aplicación principal? - gambafeliz - 12-06-2021

Estoy algo bajo por un problema de rendimiento. No es exagerado pero necesito darle una solución. Ahora mismo tengo una solución por hacer algo cutre pero espero que con esta pregunta me aporte algo mejor que mi solución.

Defino el problema:
1. Al dar click en una opción del menú lo primero que hago es cargar una vista basada en el momento exacto que se clicka, por lo tanto tiene que hacerse la vista para ese momento o si o si.
2. Después cargo una consulta basada en esta vista.
3. Cargo un grid con esta consulta.
4. Trato todas las filas para colorear mis filas favoritas.
5. Trato todas las filas para colorear mis filas desactivadas.
6. Destruyo la vista del punto 1. para volverla a crear en el futuro

Mis cuellos de botella se producen en dos punto, el 1 y el 6 pero ambos se deben producir cada vez que estoy en la pantalla de este grid.

Necesito:
Por favor, necesitaría saber si puedo ejecutar junto a mi aplicación gráfica otra sin interfaz gráfica que cargue vistas en paralelo y que no haga que mi aplicación cada vez que clicko en un menú se tenga que parar para realizar estas operaciones de esta forma las cosas pesadas las haría en segundo plano y mi aplicación fluiría de forma natural.

¿esto es posible?
¿como lo hago?

Gracias.


RE: ¿Lanzar aplicación Gráfica un hilo que opere para la aplicación principal? - vuott - 12-06-2021

Perdóname, quizás sea un problema de mi traducción, pero qué quieres decir con "vista" ?


RE: ¿Lanzar aplicación Gráfica un hilo que opere para la aplicación principal? - gambafeliz - 13-06-2021

A View de SQLite a que tengo que hacer Create View [Nombre] AS Select.... a esto me refiero como "vista" y por supuesto a usarla una vez creada.


RE: ¿Lanzar aplicación Gráfica un hilo que opere para la aplicación principal? - Shordi - 13-06-2021

Cita:1. Al dar click en una opción del menú lo primero que hago es cargar una vista basada en el momento exacto que se clicka, por lo tanto tiene que hacerse la vista para ese momento o si o si.
No veo por qué. Una vista no es más que una consulta sql almacenada con nombre propio. Créala y déjala creada una sola vez (por ejemplo en la primera ejecución del programa) No es necesario crearla y borrarla cada vez.
Cita:4. Trato todas las filas para colorear mis filas favoritas.
5. Trato todas las filas para colorear mis filas desactivadas.
Tampoco es necesario. Eso te lo hace el método Data del gridview de manera automática e infinitamente más rápida.
Cita:6. Destruyo la vista...
Innecesario. Véase punto 1


RE: ¿Lanzar aplicación Gráfica un hilo que opere para la aplicación principal? - gambafeliz - 13-06-2021

Si es una consulta almacenada pero te cuento.

Tengo que hacerla y destruirla cada vez. Te describo por que.

La ventana de gambas es una lista de cuentas económicas que te presenta dos columnas el nombre y el saldo presente y futuro de justo el mes actual. Sabiendo esto en cada actualización o alta o baja tengo que volver a crear la View por que es una agrupación que se basa cada vez en la fecha y en los cambios, pero sobre todo en la fecha que tal como lo describo al menos y ahora caigo puedo refrescar cada mes nada mas ya que al ser una consulta almacenada refresca los datos la view de forma automática, esto lo acabo de conocer desde hace poco pero si ya lo he aprendido.

Lo de los colores me cuentas que se resuelve con Data pero es que no se ni su funcionamiento ni se nada de este método vamos no sabría ni hacer nada.

Y lo de destruir con Drop la View pues lo mismo que antes quizás una vez al mes, si lo detecto cada cambio de mes. Y hablando contigo paso el mal trago de esperar la creación del view una vez solo al mes con lo cual es menos doloroso pero lo ideal es crearlo en segundo plano para que no me fastidie el uso de la interfaz gráfica.

¿Es posible hacer la ejecución de un programa tipo demonio que haga tan solo funciones de crear view cuando yo lo determine y que no me afecte en nada el uso de la aplicación principal?

Es que en cada create view mas o menos gordo me fastidia y me para segundos o 1 minuto dependiendo de si lo hago con disco duro o con pendrive en otro pc.

Ah gracias Shordi por tu indicación pero si me profundizas por favor.


RE: ¿Lanzar aplicación Gráfica un hilo que opere para la aplicación principal? - Shordi - 13-06-2021

Cita:tengo que volver a crear la View por que es una agrupación que se basa cada vez en la fecha y en los cambios, pero sobre todo en la fecha
Sigo sin ver el problema: Si tienes que agrupar según el mes que estás o el que viene sólo tienes que utilizar la función date de Sqlite, con los modificadores que Sqlite ofrece.
Por ejemplo con un campo llamado 'miFecha' en una tabla llamada 'miTabla':

SQL
  1. SELECT * FROM miTabla WHERE miFecha <=DATE('now','start of month','+2 month','-1 day') AND fecha >= DATE('now','start of month')



Eso te filtra todos los registros de este mes y de el que viene. Una consulta como esta o similar almacenada como View no necesita ser rehecha con cada cambio de mes.

Si aún así te aferras a tu intención inicial, la manera de programar "hilos" en Gambas es la clase Task.

Copio de las Ayudas:
Task (gb)
DESDE 3.3
Esta clase virtual tiene como objetivo ser la clase principal de todas las tareas en segundo plano.
Esta clase no es instanciable.
Propiedades
Métodos Eventos
Manejar Valor en ejecución Kill Stop Wait Error Kill Read
¿Como funciona?
Para ejecutar una tarea en segundo plano:
Debe crear una clase que herede Task.
Esa clase debe tener un método "Main" público que no tenga argumentos.
Debe instanciar la clase para iniciar una nueva tarea.
Luego, el método Main se ejecutará automáticamente en segundo plano en la siguiente llamada del bucle de eventos.
El método Main se ejecuta mediante una bifurcación. Puede acceder a todas las demás partes del programa, excepto que el proceso principal no verá ningún cambio realizado por la tarea.
A muchos componentes no les gustará que se bifurquen. Especialmente los de GUI. Así que ten cuidado.
Enviar argumentos a la tarea
Para enviar argumentos a la tarea, simplemente defina algunas variables públicas en ella y rellénelas antes de que comience la tarea.
Recibir un resultado de la tarea
El método Main puede devolver cualquier valor que se enviará al proceso principal a través de un proceso interno de serialización / deserialización.
El valor puede ser cualquier valor que pueda utilizar con la instrucción WRITE.
El proceso padre solo tiene que leer la propiedad Value para obtener ese valor de retorno.
Salidas estándar de la tarea
La salida estándar de la tarea (instrucción PRINT) y la salida de error (instrucción ERROR) se redirigen automáticamente, y el proceso principal las obtendrá a través de los eventos de lectura y error.
Errores de tareas
Si sucede algo malo durante la ejecución de la tarea, el proceso padre puede aprenderlo leyendo la propiedad Value, porque se generará un evento de error. Con suerte, el mensaje de error explicará el problema.
Prioridad de la tarea
Para reducir la prioridad de una tarea, use la propiedad Application.Priority.


Yo la he utilizado sólo una vez en un programa de mensajería entre escritorios que hice para el curro. Cada comprobación de si había mensajes detenía el programa unos tres segundos, lo que era un coñazo si tú etabas escribiendo un mensaje. Desviando esa tarea a un "hilo" (Gambas no soporta programación por hilos real), ni te enterabas de que se estaba haciendo la comprobación y todo fluía muy bien.
Requiere cierto nivel de prueba y error... pero no es difícil de usar.

Saludos.


RE: ¿Lanzar aplicación Gráfica un hilo que opere para la aplicación principal? - gambafeliz - 13-06-2021

Perfecto gracias y estupenda info. Pues voy a tirar por mi camino haber si esto me da felicidades futuras.