alberto-moyano   28-08-2024, 00:51
#1
Hola gente,

no sé si observaron que el IDE de gambas al momento de generar un empaquetado bloquea los menúes, hay un mensaje (abajo a la derecha que nos dice cuanto le falta en tiempo), este concepto me parece muy útil, escribí este código para mi aplicación (no es exactamente lo mismo)

Código:
' Deshabilitar todos los menús y submenús
Public Sub BloquearMenus()

  FMain.menuArchivo.Enabled = False
  FMain.menuLTX.Enabled = False

End

' Habilitar todos los menús y submenús
Public Sub DesbloquearMenus()

  FMain.menuArchivo.Enabled = True
  FMain.menuLTX.Enabled = True

End

llamo a las funciones al inicio y cierre de las otras funciones, y anda, pero solo unos segundos y luego los menúes vuelven a estar disponibles, indudablemente mi enfoque es errado o me falta algo.

Cuál es mi caso, tengo en varios menúes con funciones [1] que se ejecutan en un TerminalView y la intención es no tener acceso al resto de las funciones, mientras alguna se ejecuta.

Por donde van los tiros... pensé en la captura del evento, pero no estoy seguro.

Gracias de antemano

[1] compilaciones con LuaLaTeX, LaTeXML y Pandoc, utilizar TerminalView me da mejor control (comparado con ejecutar desde Shell) ya que accedo en forma directa al logfile del compilador que queda en la TerminalView.

Actualización del estado de la cuestión

Pude entender que pasa, la función DesbloquearMenus se ejecuta luego de ejecutar las instrucciones en la terminal, pero no sigue el estado del proceso de la instrucción en sí (en este caso el compilador de LaTeX, trabajando en back).

Veo que por acá vienen los tiros, veré de hacer algunas pruebas.

Esta es una de las tantas funciones adonde pretendo aplicar el bloqueo de menues

Código:
Public Sub menuPDFlibro_Click() 'generamos el PDF libro

  Dim newFile As String
  Dim rutaFija As String
  Dim newLog As String

  ' Llamamos a la función del módulo para verificar los metadatos obligatorios
  If Not Mod_Funciones.registrosObligatorios(TextBox1.Text) Then
    ' Si la función retorna False, cancelamos la operación
    Return
  End If

  newFile = "pdf-" & BaseName & ".tex"
  rutaFija = File.Dir(TextBox1.Text) &/ "files"
  newLog = "gbTeX-" & BaseName & ".log"

  Borrar_Aux
  Wait 0.2

  TabPanel1.Index = 0

  ' obtenemos la exportación de los archivos bib, glo y meta
  Mod_Exportar.Exportar2BibTeX(TextBox1.Text)
  Mod_Exportar.Exportar2Glosario(TextBox1.Text)
  Mod_Exportar.Exportar2MetadatosPDF(TextBox1.Text)
  Wait 0.2

  ' revisamos la carpeta pdf y borramos el archivo
  Mod_Funciones.ManagePdfFolder(TextBox1.Text)

  ' combino el archivo de cabecera .tex 
  TerminalView1.Input("cat " & rutaFija &/ "book-pdf.tex" & " " & File.Name(TextBox1.Text) & " > " & newFile & "\n")
  Wait 0.2

  ' compilo con el script de latexmk
  TerminalView1.Input("latexmk -l -f --interaction=nonstopmode -pdflatex=lualatex -pdflua " & newFile & "\n")
  Wait 0.2

  ' compilación adicional para indexar los glosarios
  TerminalView1.Input("lualatex --interaction=nonstopmode " & newFile & "\n")
  Wait 0.2

  ' ejecutamos en conteo del archivo LaTeX
  TerminalView1.Input("texcount -sub -sum -incbib -out=" & rutaFILES & "/gbTeX-" & BaseName & ".txt " & newFile & "\n")
  Wait 0.2

  TerminalView1.Input("rm -rf " & newFile & "\n")
  Wait 0.2

  TerminalView1.Input("mv " & File.Dir(TextBox1.Text) &/ "pdf-" & BaseName & ".pdf" & " " & File.Dir(TextBox1.Text) &/ "pdf/" & BaseName & ".pdf" & "\n")
  Wait 0.2

  ' copiamos /files el archivo .log
  TerminalView1.Input("cat pdf-" & BaseName & ".log > " & rutaFILES & "/gbTeX-" & BaseName & ".log" & "\n")
  Wait 0.2

  ' eliminamos los archivos auxiliares de \include
  TerminalView1.Input("rm -rf " & File.Dir(TextBox1.Text) & "/artcap/*.aux" & "\n")
  Wait 0.2

  ' generamos una vista con texlogsieve
  TerminalView1.Input("texlogsieve " & rutaFILES & "/gbTeX-" & BaseName & ".log > " & rutaFILES & "/gbTeXv-" & BaseName & ".log" & "\n")
  Wait 0.2

  Borrar_Aux

  TerminalView1.SetFocus()
  TerminalView1.Refresh()

End
Última modificación: 28-08-2024, 03:46 por alberto-moyano.
Shordi   28-08-2024, 09:26
#2
Tengo hechas cosas parecidas y lo solucioné con un flag.
Declara una variable booleana pública en fmain y que los menús se activen o desactiven dependiendo de ella. La instrucción que cambie el estado de los menús ha de estar siempre, si es posible, en el fMain, es decir se desactiva, se llaman a las funciones y se activan. Sin embargo el que sea pública permite cambiar ese estado desde cualquier función o subfunción que lo necesite.


Saludos

No podemos regresar
tincho   28-08-2024, 13:44
#3
Podes bloquear el objeto, de esta manera evitas que se generen eventos, luego lo desbloqueas.

Código:
' Bloqueo, no mas eventos de FMain.menuArchivo
Object.Lock(FMain.menuArchivo)
' Desbloqueo, vuelven los eventos de FMain.menuArchivo
 Object.Unlock(FMain.menuArchivo)

1 Saludo.
alberto-moyano   28-08-2024, 16:02
#4
Gracias Shordi, hice la prueba y obtengo los mismos resultados que con mi código (se deshabilita unos segundos y luego se habilitan), el problema está (ahora con este último ejercicio lo entendí mejor) en que necesito tomar control sobre el proceso que esta corriendo en TerminalView1, estoy haciendo unas pruebas leyendo el estado de la terminal (TerminalView.Read), después cuento como me fue.

PD: latexmk es un script en Perl que analiza la cabecera del archivo latex y automatiza cuantas vueltas de compilación se necesitan, léase cuantas veces compilar el mismo archivo tex con diferentes archivos auxiliares (en función de su complejidad, por ejemplo los diferentes índices [autor, onomástico, bibliográfico, etc.]), es por eso que no se puede predefinir cuanto dura la compilación.

Gracias Tincho, haré algunas pruebas y cuento

Pude solucionar mi problema [1], es un parche, pero logra su objetivo, TerminalView1 tiene ahora propiedad Enabled = False, es un parche mientras no pueda saber como tomar el control de los procesos dentro de la terminal.

[1] el problema radicaba en que si en la terminal estaba corriendo una compilación, la llamada a cualquier otra función que necesitara la terminal, bloqueaba el programa, ahora --y sigo sin entender porque-- al tener TerminalView.Enabled = False, las funciones se ponen en cola, quiero decir, mientras compila un archivo, ejecuto otras funciones que necesitan la terminal y estas se ejecutan a medida que van terminando los procesos.
Última modificación: 28-08-2024, 16:22 por alberto-moyano.
Shordi   29-08-2024, 09:45
#5
Se me ocurren dos cosas que puedes hacer dependiendo de si esos procesos deben interactuar con el resto del programa mientras se ejecutan o no.

Si no deben interactuar utiliza un fork. Es lo más parecido a la multitarea que tiene gambas y funciona bastante bien.

Si deben interactuar, utiliza la técnica del flag por presencia de fichero. Creas un fichero al inicio del proceso, y con un timer compruebas si sigue existiendo. Cuando el proceso termine, que el script del mismo se encargue de borrar el fichero y el timer detectará eso y reactivas los menús entonces.

Más elegante sería utilizar esa misma técnica vigilando el fichero con la clase Watch

Si te vale alguna de las ideas, me sentiré muy bien. Big Grin Big Grin Cool

No podemos regresar
  
Usuarios navegando en este tema: 2 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.