Что нового

Последовательная и (или) параллельная работа скриптов

pro100leto

Новичок
Сообщения
8
Репутация
0
Не давно начала осваивать основы AutoIt v3, то есть моё кунгфу в этой области ноль)
Естественно возникают вопросы кажущееся огромной стеной

Пример:

Есть скрип который работает последовательно
Код:
HotKeySet("{Home}", "start")
HotKeySet("{End}", "stop")
HotKeySet("{Esc}", "pause")

While 1
 Sleep(100)
WEnd

Func Start()
 while 1
   PixelSearch ( 523, 642, 522, 642, 0xCD442E,2)
   If Not @error Then; Если цвет СОВПАЛ нажмётся 1,2
		 Sleep(250) ;ждём
         Send ("{1}") ;нажимает
         Sleep(250) ;ждём
         Send ("{2}") ;нажимает
         Sleep(250) ;ждём
        Else
		 PixelSearch ( 446, 633, 500, 640, 0xE3482F,2)
         If @error Then;  Если цвет НЕ СОВПАЛ нажмётся 3,4
		    Sleep(250) ;ждём
            Send("{3}") ;нажимает 
		    Sleep(250) ;ждём
	        Send("{4}") ;нажимает 
		    Sleep(250) ;ждём
           Else
            PixelSearch ( 500, 630, 504, 640, 0xF14B31,2); 
            If Not @error Then; Если цвет СОВПАЛ нажмётся 5,6
               Sleep(250) ;ждём
               Send("{5}") ;нажимает 
		       Sleep(250) ;ждём
	           Send("{6}") ;нажимает 
		       Sleep(250) ;ждём
              Else
               Sleep(250) ;ждём
	           Send("{TAB}") ;нажимает 
		       Sleep(250) ;ждём
               
            EndIf
         EndIf
   EndIf
 WEnd
EndFunc

Func Pause() ;Функция паузы
 While 1
  Sleep(1)
 WEnd
EndFunc

Func Stop() ;Закрыть скрипт
 Exit
EndFunc


По моему мнению - это больше похоже на последовательность ТРЁХ проверок, именно последовательность, после чего нажмётся клавиша TAB

И ВОТ Вопрос 1: каким образом сделать их работу параллельной (одновременно)?

Вопрос 2 : как проверить валидность, читабельность скрипта?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
pro100leto [?]
каким образом сделать их работу параллельной (одновременно)?
одновременно никак. если только сделать несколько скриптов и установить метод общения между ними (если нужен обмен данными)

как проверить валидность, читабельность скрипта?
тут не совсем понял. читабельность для кого?
 
Автор
P

pro100leto

Новичок
Сообщения
8
Репутация
0
одновременно никак. если только сделать несколько скриптов и установить метод общения между ними (если нужен обмен данными)
можно поподробней пожалуйста, на моём примере показать?

тут не совсем понял. читабельность для кого?
Ну тут меня интересует красота кода)) его правильность и понятность для других)
Правильно ли я составила код?)

По поводу параллельности работы я сделала так:
Разбила код на Три часть и скомпелировала их в три .ехе файла, и сделала ещё один для их одновременного запуска
Результат: :scratch:
минусы - 1. в трее висит три ехе файла
2. должны все три стартовать по нажатию клавиши HOME, но запускается только один причём рамдомно
3. это всё просто не красиво
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Интеракция(обмен информацией между 2-мя скриптами)


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

Запускается 1 рандомно потому что каждый из них нацелен на обработку клавиши HOME, в системе они "грызутся" по этому поводу и получается что только какой нибудь один получает уведомление о нажатии


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

Может надо было последний файл создавать не просто для одновременного запуска, а "понапихать" туда хоткеев и пусть программа бы запускала первые 3 или 2 скрипта по необходимости
 
Автор
P

pro100leto

Новичок
Сообщения
8
Репутация
0
MnM спасибо! я уверина что этот пример мне поможет в скором будущем, но пака - это пример очень глубокая вода для меня :(






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

Запускается 1 рандомно потому что каждый из них нацелен на обработку клавиши HOME, в системе они "грызутся" по этому поводу и получается что только какой нибудь один получает уведомление о нажатии
я так и подумала
Может надо было последний файл создавать не просто для одновременного запуска, а "понапихать" туда хоткеев и пусть программа бы запускала первые 3 или 2 скрипта по необходимости
попробую спасибо
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
pro100leto сказал(а):
в трее висит три ехе файла
Если вас не устраивает это то можно установить в начале этих трех файлов директиву
Код:
#NoTrayIcon

Которая запретит отображение иконок в трее
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
OffTopic:
Сколько помощников слетается на темы где пишут от женского лица :D
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
OffTopic:
Ну не каждый день женские лица появляются за вопросом, Belfigor согласитесь :sorcerer:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Belfigor [?]
Сколько помощников слетается на темы где пишут от женского лица
А чем женщины хуже других, они ведь тоже люди.

pro100leto [?]
И ВОТ Вопрос 1: каким образом сделать их работу параллельной (одновременно)?
Как сказал с учитель стэнфорда с уроков ютуба: реально процессы выполняются поочерёдно-последовательно и создаётся впечатление что они работают параллельно. Ну с точки зрения программы это параллельно, так как последовательно это с точки зрения процессора.
Другими словами 3 последовательные операции, если они работают быстро то их можно воспринимать как параллельные, потому что выполнятся одновременно.

В вашем примере вложенные условия ограничикают работу, так как второй блок операторов зависит от результата работы первого блока оператора. Просто делайте последовательно, а не вложенно.
 
Автор
P

pro100leto

Новичок
Сообщения
8
Репутация
0
Так,Ребята!! :smile: не засоряйте мне тему !

господин Belfigor сам нарушает правила раздела, хотя как я заметила вы любите давать всем предутпреждения ;D разделе Ботов, в каждой новой теме весит от вас подарочек :smile:

Сколько помощников слетается на темы где пишут от женского лица

причём тут - это. я ж не называла тему " Помогите Блондинке запустить ракету"
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
pro100leto
В крайнем случае можно сделать главный скрипт, который будет запускать .au3 скрипты по командам.

Банальный вариант:
Код:
ShellExecute

(при условии, что на двойной клик у вас происходит запуск, а не редактирование).
 
Автор
P

pro100leto

Новичок
Сообщения
8
Репутация
0
есть вот такая часть кода

Код:
PixelSearch ( 446, 633, 500, 640, 0xE3482F,2); если цвет не совпал
		    If @error Then  ;то нажмётся плюс пока цвет не совподёт
		        Sleep(250)   ;ждём
		        Send("{+}") ;нажимает
		        Sleep(250)   ;ждём

При этих условиях плюс будет нажиматся постоянно пока цвет не совпадёт, а надо чтоб плюс нажался один раз
 

Spyhunter

Знающий
Сообщения
56
Репутация
13
есть вот такая часть кода

Код: AutoIt [Выделить]
PixelSearch ( 446, 633, 500, 640, 0xE3482F,2); если цвет не совпал
If @error Then ;то нажмётся плюс пока цвет не совподёт
Sleep(250) ;ждём
Send("{+}") ;нажимает
Sleep(250) ;ждём

При этих условиях плюс будет нажиматся постоянно пока цвет не совпадёт, а надо чтоб плюс нажался один раз

Если этот участок кода не в цикле, то он как раз выполняется только 1 раз :scratch:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
OffTopic:

Мало того что я согласен с Belfigorом,
так я ещё согласен с тем что написано между строк - я тоже всегда склонен сомневаться...
:rofl:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
pro100leto [?]
При этих условиях плюс будет нажиматся постоянно пока цвет не совпадёт, а надо чтоб плюс нажался один раз
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 

darkwhite

Знающий
Сообщения
129
Репутация
5
OffTopic:
AZJIO
Как сказал с учитель стэнфорда с уроков ютуба: реально процессы выполняются поочерёдно-последовательно и создаётся впечатление что они работают параллельно. Ну с точки зрения программы это параллельно, так как последовательно это с точки зрения процессора.
Другими словами 3 последовательные операции, если они работают быстро то их можно воспринимать как параллельные, потому что выполнятся одновременно.
В вашем примере вложенные условия ограничикают работу, так как второй блок операторов зависит от результата работы первого блока оператора. Просто делайте последовательно, а не вложенно.
немного добавлю что это справедливо только когда на машине установлен 1 процессор или ОС не поддерживающая многопоточность и многопроцессорность. если есть 2 проца и соответвующая ось, то потоки в процессе реально могут выполняться параллейно.
НО проблема в том что Autoit не может создавать более 1 потока :whistle:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
В контексте этого вопроса конечно имелось ввиду многозадачность, независимость одного потока от другого на уровне программы. А использовать два ядра не каждый ещё и сможет, ведь поддержка использования двух ядер например в 7zip появилась не сразу, а другие программы вообще не утруждают себя этим, им одного ядра за глаза.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
А если Вы разбили код на три разных программы зачем тогда ELSE в основном коде ???

Мой пример:
Код:
HotKeySet("{Home}", "start")
HotKeySet("{End}", "stop")
HotKeySet("{Esc}", "pause")

While 1
	Sleep(100)
WEnd

Func Start()
	While 1
		$Flag = False
		PixelSearch ( 523, 642, 522, 642, 0xCD442E,2)
			If Not @error Then; Если цвет СОВПАЛ нажмётся 1,2
				Sleep(250) ;ждём
				Send ("{1}") ;нажимает
				Sleep(250) ;ждём
				Send ("{2}") ;нажимает
				Sleep(250) ;ждём
				$Flag = True
			EndIf
		PixelSearch ( 446, 633, 500, 640, 0xE3482F,2)
			If @error Then;  Если цвет НЕ СОВПАЛ нажмётся 3,4
				Sleep(250) ;ждём
				Send("{3}") ;нажимает
				Sleep(250) ;ждём
				Send("{4}") ;нажимает
				Sleep(250) ;ждём
				$Flag = True
			EndIf
		PixelSearch ( 500, 630, 504, 640, 0xF14B31,2);
            If Not @error Then; Если цвет СОВПАЛ нажмётся 5,6
				Sleep(250) ;ждём
				Send("{5}") ;нажимает
				Sleep(250) ;ждём
				Send("{6}") ;нажимает
				Sleep(250) ;ждём
				$Flag = True
			EndIf
		If ($Flag == False) Then
			Sleep(250) ;ждём
			Send("{TAB}") ;нажимает
			Sleep(250) ;ждём
        EndIf
		Sleep(100)
	WEnd
EndFunc

Func Pause() ;Функция паузы
	While 1
		Sleep(1)
	WEnd
EndFunc

Func Stop() ;Закрыть скрипт
	Exit
EndFunc
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
pro100leto сказал(а):
можно простой примерчик?

Ну скажем так(накидал по быстрому принцип для двух скриптов):

Основной:
Код:
HotKeySet("{NUMPAD1}", "_Start1")
HotKeySet("{NUMPAD4}", "_Stop1")
HotKeySet("{NUMPAD7}", "_Pause1")

HotKeySet("{NUMPAD2}", "_Start2")
HotKeySet("{NUMPAD5}", "_Stop2")
HotKeySet("{NUMPAD8}", "_Pause2")

While 1
    Sleep( 10 )
WEnd

Func _Start1()
    If FileExists( @ScriptDir & '\_Script1.txt' ) Then _
        Return SetError( 1, 0, 'Скрипт1 уже запущен' )

    FileWrite( @ScriptDir & '\_Script1.txt', '1' )
    ShellExecute(@ScriptDir & '\_Script1.au3' )
EndFunc

Func _Stop1()
    If Not FileExists( @ScriptDir & '\_Script1.txt' ) Then _
        Return SetError( 1, 0, 'Скрипт1 не запущен!' )

    FileWrite( @ScriptDir & '\_Script1.txt', '2' )
EndFunc

Func _Pause1()
    If Not FileExists( @ScriptDir & '\_Script1.txt' ) Then _
        Return SetError( 1, 0, 'Скрипт1 не запущен!' )

    FileWrite( @ScriptDir & '\_Script1.txt', '3' )
EndFunc

Func _Start2()
    If FileExists( @ScriptDir & '\_Script2.txt' ) Then _
        Return SetError( 1, 0, 'Скрипт2 уже запущен' )

    FileWrite( @ScriptDir & '\_Script2.txt', '1' )
    ShellExecute(@ScriptDir & '\_Script2.au3' )
EndFunc

Func _Stop2()
    If Not FileExists( @ScriptDir & '\_Script2.txt' ) Then _
        Return SetError( 1, 0, 'Скрипт2 не запущен!' )

    FileWrite( @ScriptDir & '\_Script2.txt', '2' )
EndFunc

Func _Pause2()
    If Not FileExists( @ScriptDir & '\_Script2.txt' ) Then _
        Return SetError( 1, 0, 'Скрипт2 не запущен!' )

    FileWrite( @ScriptDir & '\_Script2.txt', '3' )
EndFunc


Второстепенные (_Script1.au3 ... ):

Код:
Local $_iPause = False
While 1
    ; Выполняем нужные тебе действия

    Switch FileRead( @ScriptDir & '\_Script1.txt' ) ;Или _Script2
        Case '3'
            $_iPause = True
        Case '2'
            FileDelete( @ScriptDir & '\_Script1.txt' )
            ExitLoop
    EndSwitch

    Sleep( 500 )
WEnd


Если будет более 2-х скриптов, то конечно лучше всего сделать принимающую функцию для каждой(Start, Stop, Pause) используя/
Код:
@HotKeyPressed


Если основной скомпилирован, то:
Код:
Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & @ScriptDir & '\_Script1.au3')
 
Верх