Friday, November 21, 2014

SetTimeOut, autologOff y la clase Info

Como ya sabemos, Ax permite configurar un parámetro llamado 'Parada Automática' (AutologOff) en la tabla de usuarios (UserInfo).

Lo anterior permite al sistema liberar/terminar la sesión de un usuario por inactividad, es decir, el sistema sabe cuando nada más lo tienes abierto y no ejecutas acciones en el, así que manos a la obra que esas pólizas no se van a capturar solas, o bien, tal vez eres de esos programadores que códifican con la mirada (cómo yo),  un talentoso desarrollador adelantado a su época.

¿Cómo lo hace Ax?

Pues bien, la clase Info tiene un método misterioso llamado workSpaceWindowCreated, ahí, Ax inicia algunas tareas que se ejecutan en segundo plano, una de ellas es la llamada a autologOff, pero a traves de la instrucción setTimeOut, donde establece un intervalo de ejecución y además el parámetro _idle inicializado en true.

Con esa diabólica configuración, esa tarea se ejecutará cuando el intervalo se cumpla mientras halla inactividad por parte del usuario.

Seguro a quienes tienen configurado el parámetro AutologOff habrán experimentado el cierre de la sesión sin previo aviso, así que les mostraré como poner un aviso antes de que esto pase, o si no tienen un tiempo de 'Parada Automática' el sistema les avisará de todos modos.


Lo primero es diseñar un mensaje bonito, pero como no soy diseñador, entonces simplemente sacudiremos la ventana de Ax (para que se desempolve), ésto quedará añadido en un método de la calse Info

01 void shake()
02 {
03    int hWnd, i, x, y, w, h;
04    Random random;
05    UserInfo userInfo;
06    ;
07
08    if (!isFirstExec)
09    {
10
11           hWnd = infolog.hWnd();
12           [x,y,w,h] = winapi::getWindowRect(hWnd);
13
14            random= new Random();
15
16            for (i = 0; i<200;i++)
17            winapi::setWindowPos(hWnd,1+(random.nextInt()/1000),1+(random.nextInt()/1000),w -20,h-20);
18
19            winapi::setWindowPos(hWnd,0,0,w,h);
20     }
21     this.setTimeOut(identifierstr(shake), #shakeInterval*60, true);
22     isFirstExec=false;
23}


En la línea 08 me aseguro de que la primera vez que se llame no se ejecute la sacudida, ésto porque lo haré en el arranque, luego, obtengo el hWnd en la línea 11 y después algunos datos de la ventana (línea 12).

En la línea 16 y 17 le establezco la posición con valores aleatorios, y en la 19 dejo la ventana como estaba.

En la 21 vamos a hacer recursiva la tarea.

Previamente definimos el shakeInterval con 2000 y declaramos la variable isFirstExec;


Y para llamarla por primera vez, incluimos las líneas de abajo en el método workSpaceWindowCreated.

 
    15      isFirstExec = true;
     16      this.shake();




=)

No comments:

Post a Comment