Shordi   15-09-2021, 12:25
#1
Desde hace muy poco, tan poco como esta mañana, que he actualizado a gambas 3.16.3 me encuentro que cuando uso wait en algún evento o, incluso, en alguna función llamada por algún evento, el programa se cuelga. "Vaya", me digo,"Ya tenemos bug nuevo"... y lo iba a reportar cuando se me ha ocurrido mirar la documentación. Allí se dice en una notita que no recuerdo haber visto nunca que "Si usa wait en el disparador de un evento se puede producir una recursión infinita al buble de eventos".

Lo piensas y un poco y es lógico... pero antes no ocurría eso. Ahora sí. Lo que me tira por tierra casi todo lo que tengo hecho... incluyendo los programas y vídeos del youtube, que ahora dejarán de funcionar.

(Por ese motivo me permito quejarme en voz alta: "AAAAAAAAAAAAAAAAAAAAAARRRRRRRRRRRRRRGGGGGHHHHHHH")

El problema es ¿Cómo hacer que un programa se detenga un tiempo concreto dentro de un evento? ¿Ein?
Wait era perfecto, pero ahora... ¿un bucle que cuente números? ¿uno que cuente segundos?... no dudo que encontraré solución (Se admiten sugerencias), pero vaya por dios...

Encima lo he actualizado muy feliz porque según Benoit en esta versión lo trayicon sí cambiaban de imagen... y tururú que te ví.

Señor, señor,....

Saludos desde el cabreado retiro.
Última modificación: 15-09-2021, 12:26 por Shordi.

No podemos regresar
Shell   15-09-2021, 12:38
#2
Pues si, ya que en algunos de tus videotutoriales usabas un wait que ahora no recuerdo donde.
Ah, pues el ejemplo que me enseñaste en su día con la barra de progreso.

Código:
Public Sub Copiar()
 
  Dim aarchivos As New String[]  
  Dim unarchivo As String
  Dim incrementos As Float
 
  aarchivos.Clear
  ProgressBar1.Value = 0
 
  aarchivos = Dir(directoriorigen, "*", gb.File)
  incrementos = 1 / aarchivos.Count
  For Each unarchivo In aarchivos
    ProgressBar1.Value += incrementos
    lblStatus.Text = "Copiando " & unarchivo    
    Wait 0.01    
    ' Para copiar, descomentar
    ' Copy directoriorigen &/ unarchivo To directoriodestino &/ unarchivo
  Next
  Message.Info("Copia completada")
 
  Me.Close
 
End

Ya me está diciendo el actualizador que está disponible la gambas 3.16.3....¿ que hago Shordi ?. Big Grin
Supongo que la pregunta tienes que orientarla en parte a la lista internacional.

Mirando la ayuda en inglés, ya que en español es la versión descafeinada.
Dice que uses Sleep . ¿ Has probado ?.

A ver, si tu sabes que con Sleep va a funcionar, usa una instrucción desde Shell que te busque cada uno de los archivos que tenga la palabra wait y
te la sustituya por sleep. Claro que si supieses el retardo, mejor que mejor. Siempre puedes encontrar que programas lo tienen.

Código:
grep -r -i "wait 0.1"

Vaya lista..

Código:
grep -r -i "wait 0.1" | wc -l

En mi caso 184 coincidencias.. Big Grin

Me temo que cambiar wait por sleep usando el mismo retardo no va... ni se inmuta en el código anterior. Confused

En algunos ejemplos que he visto que usan "sleep" que parece que esta instrucción ya existía en Gambas2.
Suele usarse conjuntamente con procesos externos. ( Creo que Wait también hubiese valido ).

Por ejemplo en el programa EmuFamily, que al convertirlo de Gambas2 al Gambas3 me estaba dando error Gambas3
tales como este: ( No quiero derivar el tema ).

[Imagen: xPpNID2.png]

Aparentemente el archivo se crea.

Código:
...
  Shell ("rm /tmp/ef.txt")
  Sleep 0.5
  Shell ("ls " & Settings["Rutas/Roms"] & " > /tmp/ef.txt")
  Sleep 2.5
...

Es curioso que no usara Wait.

Corrijo.

Ese bloque de instrucciones que he mostrado del progressbar, instalando la nueva versión de Gambas (3.16.3) sigue funcionando con wait.
Parecía que iba a tener que dejarlo de usar. Angel

Ese código no me ha valido para comprobar el problema que tu comentas.




Saludos
Última modificación: 15-09-2021, 14:12 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tincho   15-09-2021, 15:28
#3
Shordi, lo que dice Shell funciona pero no se refresca el formulario, por ejemplo en una barra de progreso.

Código:
Public Sub ToolButton1_Click()

  Dim i As Integer
 
  For i = 0 To 100
    Slider1.Value = i
      Sleep 0.01
    'Wait 0.01
  Next

End

Pasa un fragmento de código, para ver como usas el wait exactamente.
Saludos.

1 Saludo.
Shordi   15-09-2021, 17:16
#4
Vale. No es tan grave como creía. Sigue funcionando como antes... salvo que lo utilices en un evento de un formulario que tenga un trayicon activo.

Un TrayIcon NO es un control y no se comporta como tal. No he mirado el código en sí mismo, pero da la sensación de parecerse más a lo que es un Fork que a otra cosa. Imagino que tiene su propio bucle de eventos a parte del "principal" y ese bucle de eventos sí entra en un bucle infinito si utilizas wait en un evento de un control.

El tema es: Dado que el gb.form.dialog ofrece el diálogo Asskpassword, pues me ha parecido buena, en el programa CCP (ya sabéis el que conecta  con la VPN), el código del formulario "Conectar" que sólo contiene los campos user y pass y hace la conexión, al formulario fMain, que tiene el trayIcon y sustituir el Conectar por un Dialog.Askpassword.

A partir de ahí todo se congela en cuanto uses wait.

Resumiendo: No uséis wait en los eventos de un formulario con un TrayIcon.

Nota: He deshecho todos los cambios y ahora funciona bien... y ¡Sí cambia la imagen del TrayIcon! Big Grin Big Grin Big Grin

Saludos

No podemos regresar
Shell   15-09-2021, 19:26
#5
Bueno, no fue para tanto. Smile

Parece que sleep es para cosas muy concretas. El ejemplo de la ayuda en inglés  para leer un puerto serie pues como que no
es algo que hagamos habitualmente.

En cambio sleep con el uso de un proceso externo, puede ser más común. Pero ya en la misma instrucción del proceso se le puede incluir la opción wait. Huh
Si fuese en los tiempos de Gambas2 a lo mejor no existía esa posibilidad con los procesos.

Se pretende cierta fluidez no que se congele la aplicación. Que en determinados momentos es mejor usar sleep que wait, pero eso lo tendremos
que ver con el tiempo y lo que hagamos.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
gambafeliz   15-09-2021, 22:10
#6
Lo se esto no es respuesta y para nada válida.

Pero Shordi tu comentario me hace que prefiera ni plantearme actualizar más lejos de la versión actual que tengo. Todo va y funciona bien para que quiero más, hasta soy feliz con Gambas, es como estar con la mujer que quieres y esperas.

Así me quedo.
gambafeliz   16-09-2021, 10:50
#7
Hola como respuesta.

Tu la sugieres en la introducción de este hilo y si lo pensamos en profundidad Benoit crea Wait + tiempo.

Pues mi sugerencia es crear eso que ambos pensáis como válido, una subrutina que será llamada como quieras por ejemplo Wait y se le sugiere un parámetro en milisegundos para que retenga el tiempo solicitado por el programador.

En fin, una sugerencia, saludos Smile
Shell   16-09-2021, 14:29
#8
(15-09-2021, 22:10)gambafeliz escribió: Pero Shordi tu comentario me hace que prefiera ni plantearme actualizar más lejos de la versión actual que tengo. Todo va y funciona bien para que quiero más, hasta soy feliz con Gambas, es como estar con la mujer que quieres y esperas.

En el caso del lenguaje no queda otro remedio a menos que sea realmente importante, pares  la actualización y esperes una solución.
En parte para eso estamos los usuarios desarrolladores, comunicándoselo al desarrollador principal.

Cuando salió la 3.16 con sus problemas, en una distro tenía la 3.15 y en otra la 3.16. Motivos, necesitaba que se ejecutase un proyecto de
Gambas3 sin errores en ese momento.

En caso de ser desarrollador profesional y tengo mis aplicaciones y mis usuarios, me debo a ellos, no puedo permitir dejarlos tirados.
Debo volver a la versión que funciona. El como se hace, es otra cuestión. Eso no quita que mientras de cara a la galería usase 3.15
no dejaría de ver como se van solucionado los errores de la 3.16 para poder incorporarlo lo antes posible.

Como usuarios y programadores de Gambas debemos dar soporte a Gambas y a los usuarios.
Los errores se solucionan dando opciones, antes o después. Wink

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 3 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.