Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "Threads", по ссылке из статьи "Hotkeys (Mouse, Joystick and Keyboard Shortcuts)", в содержании - "Hotkeys".

Ник переводчика: semechka.

Настоящее имя переводчика: Светлана Семёнова, г.Реутов Московской обл.

Потоки

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

Несмотря на то, что AutoHotkey фактически не использует множественные потоки, она моделирует это поведение: если начать второй поток - например, нажимая очередную горячую клавишу, пока предыдущая еще работает - текущий поток будет прерван (временно остановлен), что позволит новому потоку стать текущим. Если начать третий поток, когда второй еще работает, то и второй и первый потоки окажутся в неактивном состоянии, и так далее.

Когда текущий поток закончится, самый последний прерванный поток будет возобновлен, и так далее, до тех пор, пока не закончатся все потоки. После возобновления, параметры настройки потока для встроенной переменной ErrorLevel и команды SetKeyDelay автоматически возвращаются в то состояние, в котором они были до прерывания; другими словами, поток не испытывает побочных эффектов от прерывания (за исключением возможных изменений в активном окне).

Примечание: команда KeyHistory/пользовательское меню показывает, сколько потоков находится в прерванном состоянии, а команда ListHotkeys/пользовательское меню показывает, какие горячие клавиши имеют потоки.

В связи с вышесказанным: один и тот же скрипт может одновременно отображать множественные диалоги MsgBox, InputBox, FileSelectFile и FileSelectFolder. Это достигается путем запуска нового потока (через горячую клавишу, подпрограмму по таймеру, элемент пользовательского меню и т.д.), в то время как предыдущий поток уже отобразил диалог.

По умолчанию, данная подпрограмма горячей клавиши или строки автозамены не может быть запущена во второй раз, если она уже работает. Используйте команду #MaxThreadsPerHotkey для того, чтобы изменить это поведение.

Приоритет потоков

Любая горячая клавиша, подпрограмма по таймеру или элемент пользовательского меню с приоритетом ниже, чем у текущего потока, не может прервать его. В течение этого времени такие таймеры не будут работать, а нажатие определенной горячей клавиши или выбор определенного элемента пользовательского меню не будет иметь эффекта (или будет буферизовано). Вследствие этого, обычно лучше всего разрабатывать потоки с высоким приоритетом для быстрого завершения, или использовать команду Critical вместо создания высокого приоритета для горячей клавиши, подпрограммы по таймеру или элемента пользовательского меню.

Приоритет по умолчанию - 0. Все потоки используют приоритет по умолчанию, если они не изменены одним из следующих методов:

  1. Подпрограмме по таймеру устанавливается особый приоритет через SetTimer.
  2. Горячей клавише устанавливается особый приоритет через команду Hotkey.
  3. Строке автозамены устанавливается особый приоритет, когда она определяется, или через директиву #Hotstring.
  4. Элементу пользовательского меню устанавливается особый приоритет через команду Menu.
  5. Текущий поток устанавливает свой собственный приоритет через команду Thread.

Подпрограмма OnExit (если таковая имеется) будет работать всегда, когда это потребуется, невзирая на приоритет текущего потока.

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.