Funciones registradas de inicio y fin del script

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Funciones registradas de inicio y fin del script

Mensaje por Jonny »

Hola

Resulta, que ahora me ha dado por querer registrar una función para el inicio, y otra para la finalización de los programas (me parece una forma ... más elegante de hacer el código :).

Pero hay un par de cosas que no terminan de convencerme. En realidad, solo la primera, la segunda es una curiosidad.

Al registrar la función de inicio con #OnAutoItStartRegister, pasan cosas algo raras, que tienen que ver con la forma que tengo de organizar el script cuando es mucho código el que hay que escribir.

Suelo hacer un archivo para cada cosa, para tener el código bien ordenado:
Un archivo para variables globales, otro para funciones de la interfaz, etc.
Entonces, en el archivo que incluye todos los archivos, además de un:

Código: Seleccionar todo

While 1
   Sleep(10)
Wend
y alguna cosa más que sea general en el programa, pues registro la función que quiero que se ejecute al iniciar el programa, y ahí viene un poco el lío.

Resulta, que como la función quiera usar variables globales o constantes, da error, porque dice que no están declaradas. Eso tiene su parte de lógica, porque la función registrada es lo primero que se ejecuta, teóricamente. Pero, sin embargo los archivos se incluyen antes de ejecutar esa función, porque si intento usar una función que esté en uno de los archivos que he incluido, no da error de que no esté declarada.
La solución sería quizá declarar las variables globales y las constantes desde la función invocada al inicio...

Pero además, si soluciono ese problema declarando así las variables, da errores raros de funciones duplicadas con librerías que no deberían dar ningún problema, como Array.au3, etc.

Lo segundo, es la función de salida.

He visto que pasa algo curioso. Vuelve a poder tener su lógica, pero pensaba que no funcionaría así:

Código: Seleccionar todo

    Opt("MustDeclareVars", 1)
    OnAutoItExitRegister("_ShutDownFile")

    Global $MyVar="Prueba de errores sintácticos de AutoIt"

      MsgBox(0, "Test de errores", $MiVar)
      Exit(0)


    Func _ShutDownFile()
     MsgBox(0, "Test de errores", "Cerrando el programa."&@CRLF&"El código de salida es: "&@ExitCode&".")
    EndFunc
En este código, he forzado la declaración de variables (para que se vea bien lo que quiero decir) y he provocado un error grave a posta: he intentado mostrar $MYVar en un MsgBox() poniendo mal el nombre de la variable ($MiVar).

Como es de esperar, da un error de que la variable no está declarada. Yo pensaba, que en este punto, al pulsar aceptar, se cerraría el programa sin más, pero como _ShutDownFile() está registrada para que se ejecute al cerrar el programa, pues parece que incluso petando el script se ejecuta...

La duda es:
¿Hay alguna forma más fiable de saber en esa función si el script ha finalizado porque ha petado?. Si os fijáis, tal como está devuelve 1 en código de salida. Pero no lo veo muy fiable, pues yo puedo hacer:

Código: Seleccionar todo

Exit(1)
y no sabría entonces por qué ha finalizado el script exactamente.

¡FELICES FIESTAS!

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Funciones registradas de inicio y fin del script

Mensaje por Ximorro »

Respecto a lo primero no lo sabía, parece que estas funciones se ejecutan muy al principio y muy al final, quizás de forma previa o posterior al resto del propio script, aunque es muy interesante esto que has visto que ciertamente otras funciones del script sí pueden ser invocadas (estén en includes o en el mismo archivo que el StartRegister).
Aunque ponga los Global $var antes de la directiva #OnAutoItStartRegister tampoco funciona, parece que el sistema ejecuta la función antes de hacer el setup de las variables.
También he probado la antigua versión que en vez de directiva usaba la función OnAutoItStart() y hace lo mismo.
Crear las variables dentro de la función no creo que sea buena idea, eso de declarar variables globales dentro de funciones...

Te sugiero que pases de StartRegister si tienes que usar globales, yo también considero que sería más útil si se pudieran usar, pero igual es que esta función es más especial de lo que creemos (igual se ejecuta antes que otras cosas del subsistema de AutoIt, precisamente para que sea a prueba de fallos, por ejemplo para que no te quedes sin memoria por declarar variables o cosas así). En cualquier caso son cosas que deberían especificar en la documentación.
Te sugiero que te hagas tu propia función _INICIALIZACION() o parecido y que sea lo primero que ejecutes en el script.

Estas funciones deben estar pensadas para mantenimientos especiales, como ves de hecho la función de salida se ejecuta DESPUÉS de haber marcado ExitCode, que es el valor especial que se devuelve al sistema operativo. Incluso con el error fatal se ha ejecutado...
Si lo haces para ver si tienes errores en el script no creo que sea la manera de hacerlo, es mejor escribir el código con las ayudas del analizador (au3Check) que se invoca automáticamente desde Scite o ISN.

Otra cosa que me escama de estas funciones especiales es su tratamiento diferenciado. En la versión 3.3 (y creo que 3.4) la de inicio se ponía con una función OnAutoItStart() y la de finalización con una opción Opt("OnExitFunc","OnAutoItExit").
Desde la versión 3.6 resulta que la de la fin se registra con una función y la de inicio con una directiva.
¿Es que nunca se declaran de una manera consistente? ¿no tendrían que hacerse de la misma manera? Resulta curioso que han cambiado la especificación de las dos funciones... y las han cambiado a otras dos cosas diferentes...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Funciones registradas de inicio y fin del script

Mensaje por BasicOs »

Es cierto a veces falla por cambios en la sintaxis o simplemente porque cambios en la memoria, que no te acuerdas, por eso es clave el intellisense y la ayuda para trabajar no de memoria, si no con la idea de lo que quieres hacer en la cabeza, pero con el F1 DE LA AYUDA y copiando y pegando ejemplos, así siempre funciona.
Salu22:)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Funciones registradas de inicio y fin del script

Mensaje por Jonny »

sí, al final como dice Ximorro hice una función de inicialización, porque aquello era un caos por todas partes...

En principio, en la función de salida, no he visto que falle, así que lo hice así, aunque es extraño por todo lo que dice Ximorro, como funcionan... Quizá efectivamente, algo más de información en la ayuda estaría bien, para saber exactamente su utilidad, y como usarlas.

Es cierto ¿por qué cambiarán tanto la forma de usar estas dos funciones?.

La idea de usar la función de inicialización y fin del script así, era más que nada por hacer un código teóricamente más claro y tal, pero bueno...

Salu2!
Responder