Что нового

Остановка функции

Сообщения
80
Репутация
-1
Если скрипт с несколькими функциями. Большинство короткие и после отпуская клавиши работают пару секунд. Написал этот тут почти на 1,5мин. При случайном нажатии ничего хорошего.
Нужно чтоб останавливалось при нажатии клавиши этой же или другой (break).
Нужно остановить только эту функцию чтоб скрипт работал.

Код:
HotKeySet("{F10}", "petUp3")
;-----------------------------------------------------------------------
Func petUp3 ()
   HotKeySet("{F10}"); отключаем горячую клавишу
   Do

For $vItm = 1 To 315 Step 35	;9 рядов
For $hMov = 1 To 315 Step 105	;первый ряд
For $hItm = $hMov To $hMov+104 Step 35 ;уложить 3 карты
   MouseClick("left",351+$hshop+$hItm,44+$vshop+$vItm,2,0)
   Sleep(50)
   Next ;конец установки первых 3

MouseClick("left",316+$hshop,407+$vshop,2,0)	;открыть нпц
Sleep(100)
MouseClick("left",750+$hshop,264+$vshop+$vDres,1,0)	;открыть тренировку ;760 294 9 13
Sleep(100)
MouseClick("left",750+$hshop,224+$vshop+$vDres,1,0)	;апнуть 1 ; -20
Sleep(500)
MouseClick("left",750+$hshop,224+$vshop+$vDres,1,0)	;назад
Sleep(100)
MouseClick("left",750+$hshop,244+$vshop+$vDres,1,0)	;апнуть 2
Sleep(500)
MouseClick("left",750+$hshop,224+$vshop+$vDres,1,0)	;назад
Sleep(100)
MouseClick("left",750+$hshop,264+$vshop+$vDres,1,0)	;апнуть 3
Sleep(500)

Send("y")	;открыть форму
Sleep(100)
MouseClick("left",25+$hshop,80+$vshop,4,0)	;вынуть 1
MouseClick("left",25+$hshop,206+$vshop,4,0)	;вынуть 2
MouseClick("left",25+$hshop,332+$vshop,4,0)	;вынуть 3
Sleep(300)

Next	;конец 1 ряда
Next	;конец рядов

    Until Not _IsPressed('79')
    HotKeySet("{F10}", "petUp3");включаем ее

 EndFunc


Теперь нужно сделать подобный скрипт с проверкой результата каждого шага которых до 41, не уверен что применение цикла for было лучшим решением. Мне кажется было бы проще зацепиться за if then.
Но это уже другая тема
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Я бы так попробовал
Код:
For $hItm = $hMov To $hMov+104 Step 35 ;уложить 3 карты
   If здесь условие для выхода из функции Then
      HotKeySet("{F10}", "petUp3")
      Return
   EndIf
   MouseClick("left",351+$hshop+$hItm,44+$vshop+$vItm,2,0)
   Sleep(50)
Next ;конец установки первых 3

Условие можете задавать либо проверкой нажатия клавиши, либо вызовом функции (которая будет выставлять условие) по горячей клавише.
 
Автор
W
Сообщения
80
Репутация
-1
Еслиб знать что туда воткнуть. Кроме _IsPressed нет никаких способов ввода.
Это язык псевдо не многопоточный. Он работает по принципу пока гдето ожидается условие перед паузой sleep , выполняется другой кусок скрипта.
Это язык не последовательный точно, поэтому и команд нужных нет, я то что есть мне непонятно как использовать
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
winix сказал(а):
Еслиб знать что туда воткнуть. Кроме _IsPressed нет никаких способов ввода.
Ну почему же? Например можно так
Код:
HotKeySet('{F1}', 'ExitFunc')

Global $ExitFunc = False
;.......
;......

For $hItm = $hMov To $hMov+104 Step 35
	If $ExitFunc Then
		$ExitFunc = False
		HotKeySet("{F10}", "petUp3")
		Return
	EndIf
	MouseClick("left",351+$hshop+$hItm,44+$vshop+$vItm,2,0)
	Sleep(50)
Next
 
Func ExitFunc()
	$ExitFunc = True
EndFunc
Правда всё равно может быть придётся подождать 2-3 секунды до выхода, если ваша функция выйдет из этого цикла For.
 
Автор
W
Сообщения
80
Репутация
-1
Чтото ту уж очень много ошибок.
Код:
Global $ExitFunc = False
пусть это в начале скрипта.

дальше у меня идёт меню
Код:
HotKeySet("{F10}", "petUp3")
HotKeySet("{F7}", "petCraft1")

While 1
    Sleep(2500)
WEnd

Код:
HotKeySet('{F1}', 'ExitFunc')
это записывать сюдаже?

Или это всё должно быть в функции?


Код:
If $ExitFunc Then
        $ExitFunc = False
        HotKeySet("{F10}", "petUp3")
        Return
    EndIf
Этот кусок мне просто не понятен, зачем тут это HotKeySet("{F10}", "petUp3") если отключение на F1

Код:
For $hItm = $hMov To $hMov+104 Step 35 ;уложить 3 карты

HotKeySet('{F2}', 'ExitFunc')

 If $ExitFunc Then
        $ExitFunc = False
        Return
    EndIf

Допустим кусок функции будет такой. Тогда почему вызов функции ExitFunc должен стать переменной $ExitFunc если в большинстве случаев переменными мало что можно заменить, точнее ничего кроме чисел и знаков.
Тут скорее нужно делать отдельную функцию чтоб изменить переменную
 
Автор
W
Сообщения
80
Репутация
-1
Раз уж обычного решения нет решил написать костыль. Убивать сам скрипт по нажатию клавиши.
И получилось что нифига не получилось.
If Not ProcessExists('$sProcName') Then Run($sProcName) теоретически процесс должен запускатся если не запущен, но он запускается в любом случае и их становится минимум 2.
ProcessClose("$sProcName") думал что работает как tskill, taskkill или killall в обычной системе, но в этом скрипте он убивает только одну единицу процесса но не все под этим именем.
Отсюда же появляется другая проблема из Until Not _IsPressed('1B') , пока зажата клавиша процессы продолжают запускаться, но после нажатия завершается только один.

Фактически получается что при запуске скрипта запускается процесс, при нажатии завершается один процесс, но при удержании запускается ещё множество процессов. При том что процесс один под одним именем и кнопка одна.

Так как сделать чтоб при запуске этого скрипта запускалась одна копия процесса и при нажатии клавиши запускались все и снова запускалась одна копия?

Код:
#include <Misc.au3>

$sProcName = "rzdrop.exe" 

If Not ProcessExists('$sProcName') Then  Run($sProcName)

EndIf

HotKeySet("{ESC}", "rkill")
While 1
    Sleep(2500)
WEnd


Func rkill()
    HotKeySet("{PAUSE}")
    Do
ProcessClose("$sProcName")

Sleep(300)
Run($sProcName)

    Until Not _IsPressed('1B')
    HotKeySet("{ESC}", "rkill")
 EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
winix
Вот вы, когда смотрите на код, видите, что в скобках параметры функций отличаются по цвету? А вы не спрашивали себя "Почему так происходит?". А когда поймёте, у вас возникнет другой вопрос: "А почему это я для функции Run указываю переменную без кавычек, а для других функций - с кавычками?" :scratch:

Имя переменной, указанное в кавычках, превращается в простой текст.
 
Автор
W
Сообщения
80
Репутация
-1
Перелопатил , вродебы заработало. Я не могу понять в этих языках для чего то что в кавычках ещё и в апострофах. Что вообще значит этот апостроф, если тоже самое что кавычки то почему пишут и то и другое.

Код:
If Not ProcessExists($sProcName) Then Run($sProcName)

HotKeySet("{F2}", "rkill")
While 1
    Sleep(2500)
WEnd

Func rkill()
   HotKeySet("{F2}")
   Do

   Do
ProcessClose($sProcName)
   Until Not ProcessExists($sProcName)

;Sleep(100)
Run($sProcName)

    Until Not _IsPressed('71')
    HotKeySet("{F2}", "rkill")
 EndFunc


Кнопки {PAUSE}и{BREAK} почемуто не хотят работать на моей клаве, я их и с контролем и с шифтом нажимал, никак их скрипт не видит, может дело в usb клаве.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
winix
почему пишут и то и другое
Вам бы начать со справки. Справка в AutoIt, как учебник.
Вот здесь в разделе "строки" подробно всё расписано. Если что не понятно - прям скопируйте оттуда и укажите, что конкретно не понятно. Ещё про расстановку кавычек можете почитать здесь: @ComSpec пробел

может дело в usb клаве
А может они уже заняты. Punto Switcher'ом каким-нибудь.
 
Автор
W
Сообщения
80
Репутация
-1
Punto Switcher стоит, но казалось что скрипт переопределяет всё.
Нет никаких способов сделать так чтоб клавиши в скрипте были главнее ?

Мне непонятен сам принцип почему скрипт не реагирует на нажатие клавиш на компе, а лезет кудато в ось, отсюда все и проблемы и уже не первый раз.
Опятьже не могу сделать так чтоб при нажатии на какуюто клавишу мне возвращалось двойное нажатие этой клавиши, скрипт просто её отбирает.
 
Верх