Pausar Script

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Avatar de Usuario
Juanchi
Aprendiz de Mago
Mensajes: 33
Registrado: 26 Mar 2010, 00:24

Pausar Script

Mensaje por Juanchi »

Hola a todos...
Tanto tiempo sin preguntar nada.

Bueno estaba haciendo un autoclicker para un juego (Mu Online) y me surgio esta duda : como puedo hacer para
que el programa se detenga pero SIN CERRARSE osea sin usar el comando "Exit" y que luego se pueda reanudar.

Aca esta el codigo para q vean lo q digo:

Código: Seleccionar todo


If @OSVersion <> "WIN_XP" Then ;Comprueba el SO para mostrar el Tool typ o no
	msgbox(0,"Como usar:","[Alt+M Enciende el autoclicker" & @CRLF & "[Alt]+S Apaga el autoclicker"& @CRLF & "[Alt]+[Escape] Cierra el programa")
Else
traytip("Como usar:","[Alt+M Enciende el autoclicker" & @CRLF & "[Alt]+S Apaga el autoclicker" & @CRLF & "[Alt]+[Escape] Cierra el programa",0)
EndIf

while(1)
	hotkeyset("!m","Click")
	hotkeyset("!s","Stop")
	hotkeyset("!{ESC}","Salir")
WEnd

Func Click()
	while(1)
		mousedown("Right")
		sleep(200)
		mouseup("Right")
	WEnd
EndFunc

Func Stop() ; Esta es la parte q quiero pausar osea que quede sin hacer nada... pero a su vez la tendria q combinar con la de arriba para q se fije si esta pausado y le saque la pausa al programa.
	while(1)

	WEnd
EndFunc

Func Salir()
	Exit
EndFunc
En esta parte se tendria que fijar si el programa esta pausado...

Código: Seleccionar todo

Func Click()
	while(1)
		mousedown("Right")
		sleep(200)
		mouseup("Right")
	WEnd
EndFunc
Y aca pausarlo al presionar la tecla q activa esa funcion...

Código: Seleccionar todo

Func Stop()
	while(1)

	WEnd
EndFunc
Igual lo queda sin hacer nada... Xq es un bucle vacio pero me parece al pedo q este haciendo algo cuando no se necesita osea... El programa queda haciendo "nada" infinitas veces XDDD.

El code es una boludes pero cumple su funcion jaja
No se si se entendio pero desde ya.. Gracias :D
Salu2!
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-

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

Re: Pausar Script

Mensaje por Ximorro »

¡No pongas los HotKeySet en un bucle infinito!

Ponlos fuera, sólo es necesario asignar una vez las funciones a las teclas. Después puedes poner un bucle de espera que no haga nada (no hacer nada es ponerlo a dormir, porque si no haces un Sleep te consumirá una barbaridad de CPU. No te preocupes que el Sleep es interrumpido por las teclas asignadas en HotKeySet.

Ese primer bucle quedaría:

Código: Seleccionar todo

hotkeyset("!m","Click")
hotkeyset("!s","Stop")
hotkeyset("!{ESC}","Salir")
While 1 ; <- No hace falta ponerlo entre paréntesis, eso es de otro lenguaje ;-)
   Sleep(3000) ; Por ejemplo 3 segundos
WEnd
Respecto a la pausa, se me ocurren un par de maneras. Una sería que al pausar se desactive el HotKey de Click (y quizás el de terminar, dependiendo de que permitas salir en pausa o no), cuando se vuelve a pausar vuelves a activar los hotkey que habías quitado. Muy fácil.
Para ello se crea al principio una variable global que indique si estamos en pausa, y en la función de pausa (Stop) la modificamos y según lo que valga ponemos o quitamos los otros HotKey:

Código: Seleccionar todo

Global $PAUSADO = False
If @OSVersion = ...
...
EndIf

HotKeySet("!m","Click")
HotKeySet("!s","Stop")
HotKeySet("!{ESC}","Salir")
While 1
   Sleep(3000) ; Por ejemplo 3 segundos
WEnd

Func Stop()
	$PAUSADO = Not $PAUSADO ;Cambiamos estado de pausa
	If $PAUSADO Then ; Está pausado, así que desactivamos Click
		HotKeySet("!m")
	Else ;no está pausado, reactivamos Click
		HotKeySet("!m","Click")
	EndIf
EndFunc

... Click y Salir se quedan igual.
La otra manera es que cada función de Hotkey mire la variable de pausa, y si está activa no hace nada. Esto simplifica la función de Pausa (Stop) pero creo que el método anterior es más fácil de mantener al tener todo el mecanismo de pausa programado en un sólo sitio.

Por cierto, Click se queda clavado clicando indefinidamente, ¿es lo que quieres hacer?
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Juanchi
Aprendiz de Mago
Mensajes: 33
Registrado: 26 Mar 2010, 00:24

Re: Pausar Script

Mensaje por Juanchi »

Hola Ximorro gracias x la respuesta.
Mira lo q tiene q hacer el programa es eso... Hacer click secundario hasta q se aprente alt+s (Stop) asi q iba bien xD...
Pero ahora tengo un problema... La funcion stop no me da bola.
Osea no deja de hacer clicks...
Salu2
Edito: Probando la primer forma no logro q deje de hacer clicks...

No se q podra ser pero creo q aca te equivocaste...
Xq mira... La funcion stop lo q tiene q hacer es activar $PAUSADO y aca lo desactivas
segun lo q entendi xD...

Código: Seleccionar todo

Func Stop() ; alt s
   $PAUSADO = not $PAUSADO
   If $PAUSADO Then ; Está pausado, así que desactivamos Click
      HotKeySet("!m")
   Else ;no está pausado, reactivamos Click
      HotKeySet("!m","Click")
	  endif
EndFunc
Osea $PAUSADO = not $PAUSADO eso no desactiva $PAUSADO ? XD
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-

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

Re: Pausar Script

Mensaje por Ximorro »

No, no me equivoqué, quiero decir que lo que yo quería hacer lo hice bien, lo que pasa es que no te entendí del todo y entonces el programa no es completo.
Por partes. Con $PAUSADO = not $PAUSADO activo Y desactivo con el mismo código :smt024
Eso es equivalente a:

Código: Seleccionar todo

If $PAUSADO Then
  $PAUSADO = False
Else
  $PAUSADO = True
EndIf
Es mejor en una línea (algunos incluso pondrían If $PAUSADO=True Then, eso es totalmente innecesario pues IF requiere expresiones lógicas, y $PAUSADO ya es un valor lógico.

Fíjate cómo funciona. Dices que sólo lo desactivo, pero si $PAUSADO vale FALSE (o sea, no está activo) entonces NOT $PAUSADO equivale a NOT FALSE que equivale a TRUE, con lo que $PAUSADO = not $PAUSADO equivale a $PAUSADO = True, con lo que lo activo :smt003

De la misma manera se desactiva, pero con la lógica al revés: si inicialmente $PAUSADO vale TRUE entonces NOT $PAUSADO equivale a NOT TRUE , que equivale a FALSE, con lo que $PAUSADO = not $PAUSADO equivale a $PAUSADO = False, con lo que lo desactivo :smt016

Respecto al otro problema, es que no entendía muy bien lo del bucle infinito al clicar. Tal como lo he hecho el programa se pausa ANTES de clicar, pues cuando le da al click se queda en el bucle infinito.
Hay una manera de hacer lo que quieres (bueno, habrá varias, pero ésta aprovecha lo que he hecho). Es que Click detecte si hemos pausado. Simplemente se añade una condición dentro del bucle infinito, para que deje de serlo.

Código: Seleccionar todo

Func Click()
   While Not $PAUSADO
      MouseDown("Right")
      Sleep(200)
      MouseUp("Right")
   WEnd
EndFunc
Así mientras no está pausado seguirá clickando, y al pausar el proceso se interrumpe. Pruébalo pero sospecho que me vas a decir que no es lo que quieres, porque creo que no nos entendimos bien desde el principio. Pero si es así a la próxima te digo cómo lo haría y dejaré que lo intentes tú, que si no practicas no aprendes :smt006

saludossss
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder