Что нового

Функция выполняется, ждет выполнение другой функции, затем продолжается

Rimm

Новичок
Сообщения
30
Репутация
0
Код:
#include <GUiConstants.au3>

Opt("GUIOnEventMode", 1)

$gui = GUICreate ("", 100, 100)
GUISetOnEvent ($GUI_EVENT_CLOSE, "_exit")
$Function_1 = GUICtrlCreateButton ("Function_1", 10, 10, 80, 80)
GUICtrlSetOnEvent ($Function_1, "Function_1")

_notepad ()

GUISetState (@SW_SHOW, $gui)

While 1
	sleep (1000)
WEnd

Func _notepad ()
	Run ("notepad.exe")
	WinWaitActive ("Безымянный - Блокнот")
	Send ("Что-то выполняется до Function_1")
	
	;Здесь сделать паузу до момента выполнения Function_1, потом продолжить
	
	Send ("Что-то выполняется после Function_1")
EndFunc

Func Function_1 ()
	WinActivate ("Безымянный - Блокнот")
	Send ("{Enter}")
	Send ("Выполнение Function_1")
	Send ("{Enter}")
EndFunc

Func _exit ()
	Exit
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Вам нужно просто вызвать нужную функцию:
Код:
;Здесь сделать паузу до момента выполнения Function_1, потом продолжить
Function_1 ()
 
Автор
R

Rimm

Новичок
Сообщения
30
Репутация
0
К сожалению, требуется, чтобы пользователь лично вызывал эту функцию. Я в примере потому и сделал Function_1 в виде Button.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Rimm
1. после имени функции до скобок не должно быть пробела.
2. В функцию 1 вставь триггер в начало, который сигнализирует что функции выполняется, в конце обнули триггер, чтобы указать что функция закончилась. Там, где должно ждать поставь цикл While, который будет постоянно Sleep пока триггер функции 1 включен в True.
 
Автор
R

Rimm

Новичок
Сообщения
30
Репутация
0
А можно поподробней про триггер?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
Case $Button1
	     $Trigger = True
   EndSelect

   If $Trigger Then
	  Func1()
	  $Trigger = False
   EndIf
WEnd
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
При такой конструкции у ТС мало что получится.
В исходном коде функция запускается до момента отображения окна GUI.
Если в функции "_notepad()" сделать паузу до нажатия, то пауза будет бесконечна по причине того что нажать будет не на что, т.к. пауза не дает появится окну, а значит и кнопке.


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

Просьба подсказать, для Вас критичен режим "OnEvent" или же можно предложить режим "MessageLoop" ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
У меня подозрение что эта тема создана специально чтобы поддержать моё самомнение...
Код:
#include <GUiConstants.au3>

Opt("GUIOnEventMode", 1)

$gui = GUICreate ("", 100, 100)
GUISetOnEvent ($GUI_EVENT_CLOSE, "_exit")
$Function_1 = GUICtrlCreateButton ("Function_1", 10, 10, 80, 80)
GUICtrlSetOnEvent ($Function_1, "Function_1")
GUISetState (@SW_SHOW, $gui)

Global $semafore = True
_notepad ()

Func _notepad ()
    Run ("notepad.exe")
    WinWaitActive ("Безымянный - Блокнот")
    Send ("Что-то выполняется до Function_1")

	While $semafore		;Здесь сделать паузу до момента выполнения Function_1, потом продолжить
		Sleep(1000)
	WEnd

    Send ("Что-то выполняется после Function_1")
EndFunc

Func Function_1 ()
    WinActivate ("Безымянный - Блокнот")
    Send ("{Enter}")
    Send ("Выполнение Function_1")
    Send ("{Enter}")
	$semafore = False
EndFunc

Func _exit ()
    Exit
EndFunc
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Забавно, я пробовал такой вариант, но меня смутило, что "Send ("Что-то выполняется до Function_1")" у меня не отработал.
Может я что-то не учел?


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

И да "Send ("Выполнение Function_1")" выполняется аж 6 раз


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

По функции _notepad () вообще не отработало ни одного "send"
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Да, сегодня уже читал об этом, думал, что открывается так же, не обратил внимания.
Виноват, был не прав.
Спасибо.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Чтобы не :stars: о TITLE окне можно сделать так:

Код:
Func _notepad ()
    $hRun = Run ("notepad.exe")
    WinWaitActive (WinGetHandle($hRun))
    Send ("Что-то выполняется до Function_1")

    While $semafore     ;Здесь сделать паузу до момента выполнения Function_1, потом продолжить
        Sleep(1000)
    WEnd

    Send ("Что-то выполняется после Function_1")
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Rimm [?]
А можно поподробней про триггер?
Триггер ячейка памяти содержащая два состояния 0 или 1, включено или выключено, да или нет, правда или ложь, существует или не существует. Конкретно можно использовать числа 0 или 1, булевы True или False. Функция, которая хочет влиять на события в нужный момент назначает триггеру состояние, которое можно проверить в любой точке скрипта с помощью If-Then. К примеру нужно проверить работает ли функция x или нет. Объявляем триггер равным 0, при старте скрипта, что означает, что функция не работает, потому что ещё ни одна функция не работает. Как только функция x начинает выполнятся, первое что она делает включает зелёный светофор, то есть присваивает триггеру значение 1. Теперь если работает "параллельно" цикл или AdlibRegister приостановил работу скрипта, чтобы выполнить свою функцию, то запросив состояние триггера с помощью If-Then можно понять что функция x сейчас работала и приостановлена или работает и соответственно в связи с этой информацией делаем то-то. Когда функция x завершается, то перед EndFunc обнуляем триггер. Всё.
 
Автор
R

Rimm

Новичок
Сообщения
30
Репутация
0
C2H5OH, AZJIO,
Спасибо! Это то, что нужно!
 
Верх