Kodhjälp med loop och subrutin

Trädvy Permalänk
Medlem
Registrerad
Okt 2011

Kodhjälp med loop och subrutin

Så jag har en kod i Autohotkey, och jag försöker göra så när i>40 så ska den sluta köra subrutinen (gosub watch). Problemet är att "i" variabeln finns bara i subrutinen "watch" och det är just när den går in i "else if (i>40)" som den är klar (det har gått 40 sec utan att hända något), och då vill jag att koden ska fortsätta, eg. efter continiue.

Problemet är att jag lyckas bara att komma på att starta en ny subrutin utan att gå ur den första subrutinen, som man inte bör göra. Jag är inte en van programmera (som kanske syns), men är det någon som kan komma på ett bra sätt att komma vidare?

start: color=0xFFFF00 while (//något bra att ha här) { gosub watch //kör koden tills inget har hänt i 40 sec } WinClose all click 0, 0 continiue: //koden fortsätter efter den är klar med watch rutinen //fors av kod //subrutiner watch: click 925, 340 i=0 MouseGetPos, MouseX, MouseY PixelGetColor, color2, %MouseX%, %MouseY% while (color!=color2) { i++ sleep 1000 //vänta 1sec PixelGetColor, color2, %MouseX%, %MouseY% if (color==color2) //kollar ingen så att den inte ändras efter 2sec { sleep 2000 PixelGetColor, color2, %MouseX%, %MouseY% } else if (i>40) //Inget har hänt i 40sec, antag att det är klart och sluta köra watch subrutinen { WinClose all click 0, 0 gosub continiue //starta ny subrutin utan att gå ur den vi är i nu och skapa problem senare } } return

Trädvy Permalänk
Medlem
Registrerad
Aug 2014
Skrivet av Frejoh466:

Så jag har en kod i Autohotkey, och jag försöker göra så när i>40 så ska den sluta köra subrutinen (gosub watch). Problemet är att "i" variabeln finns bara i subrutinen "watch" och det är just när den går in i "else if (i>40)" som den är klar (det har gått 40 sec utan att hända något), och då vill jag att koden ska fortsätta, eg. efter continiue.

Problemet är att jag lyckas bara att komma på att starta en ny subrutin utan att gå ur den första subrutinen, som man inte bör göra. Jag är inte en van programmera (som kanske syns), men är det någon som kan komma på ett bra sätt att komma vidare?

start: color=0xFFFF00 while (//något bra att ha här) { gosub watch //kör koden tills inget har hänt i 40 sec } WinClose all click 0, 0 continiue: //koden fortsätter efter den är klar med watch rutinen //fors av kod //subrutiner watch: click 925, 340 i=0 MouseGetPos, MouseX, MouseY , %MouseX%, %MouseY% PixelGetColor, color2 while (color!=color2) { i++ sleep 1000 //vänta 1sec PixelGetColor, color2, %MouseX%, %MouseY% if (color==color2) //kollar ingen så att den inte ändras efter 2sec { sleep 2000 PixelGetColor, color2, %MouseX%, %MouseY% } else if (i>40) //Inget har hänt i 40sec, antag att det är klart och sluta köra watch subrutinen { WinClose all click 0, 0 gosub continiue //starta ny subrutin utan att gå ur den vi är i nu och skapa problem senare } } return

Kanske jobba med en timer är lämpligare då timer skapar en ny, egen tråd?

#Persistent colorReference=0xFFFF00 pixelWatchTimeOut=40 SetTimer, PixelWatch, 1000 ; Kör PixelWatch 1 gång per sekund från 1 sekund från nu och i oberoende trådar ; ... some additional main code ... return PixelWatch: MouseGetPos, mouseX, mouseY PixelGetColor, colorChecked, %mouseX%, %mouseY% if(colorChecked==colorReference) { pixelWatchCounter++ return } if(pixelWatchCounter>pixelWatchTimeOut) { MsgBox, %pixelWatchCounter% sekunder spenderade muspekaren över referensfärgen, vilket är längre än den minsta tiden som krävs för att skapa detta meddelande, %pixelWatchTimeOut% sekunder WinClose, all Click, 0, 0 SetTimer, SomeNewThread, -1 ; skapar ny tråd och fortsätter sedan ommedelbart. Negativa millisekunder kör en timer endast 1 gång ; ... eventuellt ytterligare parallell kod eller fler nya trådar efter behov ... } pixelWatchCounter=0 return SomeNewThread: SomeFunction() ; ... some additional code ... return SomeFunction() { }

Z170-WS | Intel 6700K | Dominator 2x16GB 3000MHz | Samsung 950 Pro 2x512GB NVMe RAID0 | MSI 1080 Gaming X | Seasonic 520 Fanless | 7260 HMV-AC | Fractal Design Define R4 | Noctua NH-U12S@475RPM | Noctua P12@475RPM x5
Supermicro X10SLL-F | Supermicro 1U SC813MT-300C | XEON E3 1231v3 | Hynix 4x8GB ECC | 840 EVO | WD 6x 4TB RE
x220 | IPS | i7 | SSD | 9-cell

Trädvy Permalänk
Medlem
Registrerad
Okt 2011

Ok, jag tyckte inte om hur det vart med timern. Så jag skrev om koden litegrann, problemet är att nu har jag en while loop där första gången den körs så ska jag skippa 3 radar. Och kan inte komma på hur jag kan ta mig förbi det (goto kommando tycker inte om att hoppa in i en loop), so just nu kör jag med en variabel som ändras i en if loop.

colorref=0xBDBF2B mousemove 925, 340 a=1 while (openwindow!=closedwindow)){ if (a=0){ click 925, 340 sleep 5000 click 925, 340 } i=0 a=1 sleep 1000 MouseGetPos, MouseX, MouseY PixelGetColor, color2, %MouseX%, %MouseY% while (colorref!=color2){ sleep 1000 i++ PixelGetColor, color2, %MouseX%, %MouseY% if (colorref==color2){ ;kollar efter 2sec så att det fortfarande gäller sleep 2000 PixelGetColor, color2, %MouseX%, %MouseY% } else if (i>40){ ;inget har hänt i 40sec click 925, 390 sleep 5000 WinClose all ;sätter openwindow==closedwindow } } }