AutoIt: выполнить следующую команду после завершения предыдущей

#autoit

#автоматический запуск

Вопрос:

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

Сначала у меня не было никаких инструкций sleep, поэтому скрипт просто выполнял каждую команду, независимо от того, завершилась предыдущая или нет (т. е. нажмите SUBMIT перед завершением отправки входной строки)

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

Я надеялся, что есть способ принудительно запускать каждую строку только после завершения предыдущей?

РЕДАКТИРОВАТЬ: Чтобы быть более конкретным, я хочу, чтобы команда controlsend завершила выполнение до того, как я нажму кнопки.

Комментарии:

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

2. Если вам нужно контролировать шаги в процессе, вам нужен способ регистрировать прогресс на каждом шаге. Переменные среды являются одним из способов локализации такого рода данных, специфичных для локального процесса.

3. В AutoIt каждая строка кода выполняется после завершения другой. Проблема, с которой вы сталкиваетесь, заключается в том, что отправка сообщения Windows (например, BM_CLICK для нажатия кнопки), выполняемая AutoIt, происходит намного быстрее, чем другое приложение (часто) обрабатывает сообщение. Что вам действительно нужно, так это способ определить, обработало ли приложение запрос. Вы можете сделать это, например, в браузере, посмотрев на строку состояния внизу. Или проверьте, нет ли изменений в заголовке окна или в пикселях. Если информация недоступна, то единственной альтернативой является режим сна.

4. В вашем конкретном случае просто выполните ControlRead для элемента управления и проверьте, содержит ли он текст, который вы хотели отправить. Я думаю, это может сработать.

5. Покажите нам какой-нибудь код, и, возможно, мы сможем помочь больше.

Ответ №1:

Вместо ControlSend используйте ControlSetText. Это выполняется немедленно (как GuiEdit).

Ответ №2:

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