[AutoIt] Solución a un bucle?

Iniciado por MeCraniDOS, 20 Agosto 2013, 21:12 PM

0 Miembros y 3 Visitantes están viendo este tema.

MeCraniDOS

Hola, bueno pues tengo un problema, tengo este código:

Código (vbnet) [Seleccionar]

Func MoverIcono()

   While $VarBucle = True

$X_Escritorio = 0
$Y_Escritorio = 0


       $Area_Escr = _ImageSearch('Area.bmp', 0, $X_Escritorio, $Y_Escritorio, 0)

       if $Area_Escr = 1 Then
MouseMove($X_Escritorio, $Y_Escritorio, 5)
MouseClick("left")

       if $BuscarIcono1 = True or $BuscarIcono2 = True
         
            Do

$X = 0
$Y = 0
               
               if $BuscarIcono1 = True Then

            $Icono1 = _ImageSearch('img/Icono1.bmp', 0, $X, $Y, 0)

            While $Icono1 = 1
      MouseMove($X, $Y, 5)
      MouseClick("left")
      Sleep(2000)
            WEnd
      EndIf

               if $BuscarIcono2 = True Then

            $Icono2 = _ImageSearch('img/Icono2.bmp', 0, $X, $Y, 0)

            While $Icono2 = 1
      MouseMove($X, $Y, 5)
      MouseClick("left")
      Sleep(2000)
            WEnd
      EndIf

             Until $Icono1 = 0 or $Icono2 = 0

       Else

Sleep(10000)

       Endif

       Else

       ; (Comentario) "Error": No se ha encontrado el area del mapa  

       Endif

   WEnd

EndFunc



El código en si funciona bien, el error que da para mi es que no hace exactamente lo que yo quiero, y no se como arreglarlo...

La función lo que hace es buscar el área que yo le indico, (las coordenadas del área del escritorio están cambiadas), y va clickando en esa zona cada 10 segundos, y justo cuando da el click busca los iconos, pero en esos 10 segundos del Sleep(10000) no hace nada :-\

Lo que quiero es que haga click en el área que le indico, y en esos 10 segundos, antes del siguiente click este buscando los iconos, es decir, que si activo la opción del icono1, este indefinidamente buscando ese icono y moviendo y clickando, y a los 10 segundos, haga click en otras coordenadas del escritorio y siga buscando hasta pasados los próximos 10 segundos, etc

Espero que puedan ayudarme, creo que no hace falta saber de este lenguaje para contestar, cualquier bucle es igual sea en el lenguaje que sea  :¬¬

Saludos
"La física es el sistema operativo del Universo"
     -- Steven R Garman

Stakewinner00

Si lo que quieres es que haga una cosa al mismo tiempo que espera los 10s me temo que necesitaras un multithread, en C++ no es especialmente complicado pero claro tiene que ser de scripting, no?

MeCraniDOS

"La física es el sistema operativo del Universo"
     -- Steven R Garman

#!drvy

Y porque simplemente no creas una funcion que se encargue del click y que vaya midiendo el tiempo.

Osease, sustituyes MouseClick (y MouseMove si hace falta) por una función que por muchas veces que la llamen, solo haga 1 click cada 10 segundos.

Saludos

MeCraniDOS

Cita de: drvy en 20 Agosto 2013, 23:35 PM
Y porque simplemente no creas una funcion que se encargue del click y que vaya midiendo el tiempo.

Osease, sustituyes MouseClick (y MouseMove si hace falta) por una función que por muchas veces que la llamen, solo haga 1 click cada 10 segundos.

Saludos

Porque esa función ya esta, si pones:

Código (vbnet) [Seleccionar]
MouseClick("left", $X_Escritorio, $Y_Escritorio, 1, 10000)

Clicka cada 10 segundos, pero estamos en las mismas, no hace lo que esta a continuación, espera 10 segundos, clicka y pasa a la siguiente función  :-\
"La física es el sistema operativo del Universo"
     -- Steven R Garman

#!drvy

#5
1. No hagas sleep. No es lo mismo comprobar si la ultima llamada que se hizo fue hace 10 segudos que esperar 10 segundos para recibir la proxima llamada.

2. La función invocala desde el while y pasale los parametros (cursor x,y)

Edit: Obviamente lo que te recomienda stake es mucho mejor y mas optimizado pero si lo quieres hacer sin mas a lo burro... es lo que haria xD

Saludos

Danyfirex

#6
hola
usa

DllCallbackRegister

saludos.


si explicas mejor lo que quieres hacer te doy una mano porque la verdad no entendí nada :S


MeCraniDOS

Cita de: drvy en 21 Agosto 2013, 02:40 AM
1. No hagas sleep. No es lo mismo comprobar si la ultima llamada que se hizo fue hace 10 segudos que esperar 10 segundos para recibir la proxima llamada.

He descartado usar el Sleep  :silbar:

Cita de: Stakewinner00 en 20 Agosto 2013, 23:25 PM
me temo que necesitaras un multithread

He estado mirando y AutoIt no permite multithread  :-(

Cita de: Danyfirex en 21 Agosto 2013, 04:18 AM
si explicas mejor lo que quieres hacer te doy una mano porque la verdad no entendí nada :S

La función lo que hace es buscar las coordenadas en el escritorio, si no selecciono ninguna opción, mueve el ratón cada 10 segundos, (le paso un valor random, pero quité eso porque no hacia falta aquí)

Código (vbnet) [Seleccionar]
$X_Escritorio = 0
$Y_Escritorio = 0


En el caso de que $BuscarIcono1 o $BuscarIcono2 estén activadas, lo que quiero es que haga click en la pantalla, y mientras espera 10 segundos hasta volver a dar el click, escanee la pantalla buscando los iconos, así sucesivamente hasta que finalice la función.

Ahora lo que hace es, dar click, escanear la pantalla y esperar 10 segundos sin hacer nada :-\
"La física es el sistema operativo del Universo"
     -- Steven R Garman

Danyfirex

Podrías hacer algo así para saber cuando pasaron los 10 segundo y dar click. de lo contrario sigo buscando.

Código (php) [Seleccionar]
Local $begin = TimerInit()

Local $dif=0
while 1

$dif=TimerDiff($begin)
if $dif >=10000 then
msgbox(0,"","Hago clik")
$begin = TimerInit()
endif
wend


saludos

MeCraniDOS

Cita de: Danyfirex en 21 Agosto 2013, 14:43 PM
Podrías hacer algo así para saber cuando pasaron los 10 segundo y dar click. de lo contrario sigo buscando.

Código (php) [Seleccionar]
Local $begin = TimerInit()

Local $dif=0
while 1

$dif=TimerDiff($begin)
if $dif >=10000 then
msgbox(0,"","Hago clik")
$begin = TimerInit()
endif
wend


saludos


Y de que me sirve eso?

http://www.autoitscript.com/autoit3/docs/functions/TimerInit.htm

http://www.autoitscript.com/autoit3/docs/functions/TimerDiff.htm

Lo que quiero es estar escaneando la pantalla buscando los iconos mientras pasan los 10 segundos  :-\ :-\
"La física es el sistema operativo del Universo"
     -- Steven R Garman