Comunidad Gambas-es

Versión completa: La peste del wait
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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.
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.

GAMBAS
  1. Public Sub Copiar()
  2.  
  3.   Dim aarchivos As New String[]  
  4.   Dim unarchivo As String
  5.   Dim incrementos As Float
  6.  
  7.   aarchivos.Clear
  8.   ProgressBar1.Value = 0
  9.  
  10.   aarchivos = Dir(directoriorigen, "*", gb.File)
  11.   incrementos = 1 / aarchivos.Count
  12.   For Each unarchivo In aarchivos
  13.     ProgressBar1.Value += incrementos
  14.     lblStatus.Text = "Copiando " & unarchivo    
  15.     Wait 0.01    
  16.     ' Para copiar, descomentar
  17.     ' Copy directoriorigen &/ unarchivo To directoriodestino &/ unarchivo
  18.   Next
  19.   Message.Info("Copia completada")
  20.  
  21.  



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.

Bash
  1. grep -r -i "wait 0.1"



Vaya lista..

Bash
  1. 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.

Bash
  1. ...
  2.   Shell ("rm /tmp/ef.txt")
  3.   Sleep 0.5
  4.   Shell ("ls " & Settings["Rutas/Roms"] & " > /tmp/ef.txt")
  5.   Sleep 2.5
  6. ...



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
Shordi, lo que dice Shell funciona pero no se refresca el formulario, por ejemplo en una barra de progreso.

GAMBAS
  1. Public Sub ToolButton1_Click()
  2.  
  3.  
  4.   For i = 0 To 100
  5.     Slider1.Value = i
  6.       Sleep 0.01
  7.     'Wait 0.01
  8.   Next
  9.  



Pasa un fragmento de código, para ver como usas el wait exactamente.
Saludos.
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
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
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.
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
(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