Что нового

Паралельное выполнение нескольких Func

Flukes

Новичок
Сообщения
10
Репутация
0
Подскажите новичку (в программировании вобще, AutoIt первое в изучении)

Столкнулся с проблемой, в результате выявил что по горячей клавише функция запускается параллельно столько раз сколько нажал клавишу.

Вывел до простого, чтобы протестить и убедится.

Код:
HotKeySet("{F6}", "test")

While 1
WEnd

Func test() 
	Send (" First ")
	Sleep (1000)		
	Send (" Second ")
EndFunc


1. Есть ли возможность отключить параллельный запуск?
2. или не начинать выполнения этой же функции до ее окончания?

Вариант

Код:
HotKeySet("{F6}", "test")
$a=1
While 1
WEnd

Func test()
		If $a=1 Then
		$a=0
	Send (" First ")
	Sleep (1000)		
	Send (" Second ")
		$a=1
		EndIf
	EndFunc


работает но не подходит.
Хотелось бы как-то понадежнее.

Заранее Спасибо.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
623
Flukes [?]
Хотелось бы как-то понадежнее.
а что ты подразумеваешь под надежностью? твой последний скрипт отработает в 100 случаях из 100. это недостаточно надежно? это распространенная практика – работа с глобальными флагами
Код:
HotKeySet("{F6}", "test")
Global $a
$a = 1
While 1
    Sleep(50)
WEnd

Func test()
    If $a Then
        $a = 0
        Send (" First ")
        Sleep (1000)       
        Send (" Second ")
        $a = 1
    EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Flukes
Или так:
Код:
HotKeySet('{F6}', 'test')
HotKeySet('{Esc}', '_Exit')
While 1
	Sleep(50)
WEnd

Func test()
	HotKeySet('{F6}')
	Send(' First ')
	Sleep(3000)
	Send(' Second ')
	HotKeySet('{F6}', 'test')
EndFunc   ;==>test

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

rollex

Новичок
Сообщения
66
Репутация
1
А как сделать так, чтобы при вызове новой функции выполняющаяся в данный момент не продолжала выполнение после вызова второй?
Например:
Код:
HotKeySet('{F6}', 'test')
HotKeySet('{F7}', 'test2')
HotKeySet('{Esc}', '_Exit')
While 1
    Sleep(10)
WEnd

Func test()
    Send(' Hello')
    Sleep(2000)
    Send(' World ')
EndFunc

Func test2()
    Send(' Petya ')
EndFunc

Func _Exit()
    Exit
EndFunc


Если я захочу после "Hello" вывести "Petya", а не "World", конечно же вызову "test2" после того как первая функция выполнит первую часть кода. Но в таком случае получится "Hello Petya World", а как сделать "Hello Petya" ?
 
Автор
F

Flukes

Новичок
Сообщения
10
Репутация
0
Я поначалу посчитал это за глюк, и так быть не должно.

а что ты подразумеваешь под надежностью? твой последний скрипт отработает в 100 случаях из 100. это недостаточно надежно? это распространенная практика – работа с глобальными флагами

Я думал существует что-то типа выбора режима функции (с терминами туго пока)
к примеру
Func test() , (выбор режима) ; не запускать параллельно или не начинать новую.
Send (" First ")
Sleep (1000)
Send (" Second ")
EndFunc

Как понял, пока нет такого? только способом через IF?

Код:
Func test()
    If $a Then
        $a = 0
        Send (" First ")
        Sleep (1000)      
        Send (" Second ")
        $a = 1

Вот тут не понял, что значит IF $a Then ? откуда оно понимает что, если ;а = 1 тогда...??

Код:
HotKeySet('{F6}', 'test')
HotKeySet('{Esc}', '_Exit')
While 1
    Sleep(50)
WEnd

Func test()
    HotKeySet('{F6}')
    Send(' First ')
    Sleep(3000)
    Send(' Second ')
    HotKeySet('{F6}', 'test')
EndFunc   ;==>test

Func _Exit()
    Exit
EndFunc   ;==>_Exit

Тут интересный ход отключать хоткей... хм так будет меньше нагрузки, т.к. при использовании IF Игра где используется скрипт, при многократном нажатии на хоткей, начинает тормозить.
 
Автор
F

Flukes

Новичок
Сообщения
10
Репутация
0
Есть ли вариант решения данного действия без использования Func?
Код:
HotKeySet("{F6}", "test")

While 1
WEnd

Func test() 
	Send (" First ")
	Sleep (1000)		
	Send (" Second ")
EndFunc


к примеру просто IF Hotkey Then

И еще я тут начитался про разность приоритетов OnEvent и MessageLoop
Я так понимаю работа с Func это что-то типа OnEvent или я что-то путаю?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
623
Flukes [?]
что значит IF $a Then ? откуда оно понимает что, если ;а = 1 тогда...??
данный кусок кода был рассчитан именно на такую реакцию :smile: чтобы поскорее влился и прочувствовал нюансы языка. в данном фрагменте используется неявное преобразование типов. правила просты
1. любое число в переводе на булевы
а) True для любого числа отличного от 0
б) False если число 0
2. любая строка
а) ненулевой длины True
б) нулевой длины False

Т.к. If – это булев оператор и работает только с булевыми значениями, он преобразует свой аргумент в булев по вышеуказанным правилам. отсюда, легко можно сделать вывод что вместо $a = 1 может быть хоть $a = 100000. главное для False оставить именно 0.

по поводу первого вопроса, ставить в хоткей функцию с аргументом можно, но это куда муторнее, и, что самое главное, надежности не добавляет.



Добавлено:
Сообщение автоматически объединено:

Flukes [?]
это относится к GUI Concepts и к данной теме отношения не имеет


Добавлено:
Сообщение автоматически объединено:

Flukes [?]
Есть ли вариант решения данного действия без использования Func?
можно, засунь все нужные действия в основной цикл, и воспользуйся советом axlwor
 
Автор
F

Flukes

Новичок
Сообщения
10
Репутация
0
Все в принципе (пока) ясно, всем спасибо.

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

и как расставить плюсики?)))
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
623
Верх