1 (изменено: stuermer, 2023-07-15 16:45:52)

Тема: AHK: Вопрос по тредам и SetBatchLines

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

SetTimer, TWait, 5000
Return
...
TWait:
SetBatchLines, 1000ms
...

Т.е. после TWait время цикла будет сначало сброшено, а потом установлено 1000ms?

2

Re: AHK: Вопрос по тредам и SetBatchLines

Никто не знает?

3

Re: AHK: Вопрос по тредам и SetBatchLines

А что за время цикла?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: ypppu, 2023-07-15 22:06:26)

Re: AHK: Вопрос по тредам и SetBatchLines

Думаю, что stuermer хотел спросить вот что:
"Может ли подпрограмма на лету изменять настройки SetBatchLines? Причём так, чтобы эти настройки коснулись только текущего потока, а не всего скрипта".

5

Re: AHK: Вопрос по тредам и SetBatchLines

Если такой вопрос, то может.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Вопрос по тредам и SetBatchLines

Да. Потоки имеют время цикла, которое устанавливается SetBatchLines. Читаем справку. Хотя это термин из ПЛК-программирования (пром. автоматизация), он тут полностью применим. Т.е. время задержки между запусками скрипта.
Смутила эта фраза:

Every newly launched thread (such as a hotkey, custom menu item, or timed subroutine) starts off fresh with the default setting for this command. That default may be changed by using this command in the auto-execute section (top part of the script).

Они пишут, что можно менять время задержки для основного потока, но не пишут, что это можно делать для дочернего.

7

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer пишет:

Потоки имеют время цикла

Ткните, где такое в справке написано. Цикл чего вы имеете в виду? Что такое ПЛК программирование, я даже не слышал.
SetBatchLines определяет, насколько часто во время выполнения потока будет вставляться пауза в 10 мс. Это определяется для каждого потока.

#Persistent
SetBatchLines, -1
MsgBox % A_BatchLines
SetTimer, timer, -10
Return

timer:
   SetBatchLines, 50
   MsgBox % A_BatchLines
   ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Вопрос по тредам и SetBatchLines

ПЛК - так в русскоязычном интернете порой называют PLC. Это такая железяка для широкого спектра задач. На каждую задачу надо писать алгоритм. Снаружи имеет входы для подключения всяких-разных датчиков и выходы для управляющих/сигнализирующих устройств. Используется в промышленности для автоматизации технологических процессов. ПЛК бывают от разных фирм и разных моделей, какого-то единого языка программирования для них не существует. Если купишь какой-то другой ПЛК - придётся изучать всё по новой.

9

Re: AHK: Вопрос по тредам и SetBatchLines

В данном контексте цикл — это, как я понимаю, цикл опроса этих самых датчиков. В процессе работы AHK-скрипта ничего похожего не происходит.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10 (изменено: stuermer, 2023-07-17 18:14:50)

Re: AHK: Вопрос по тредам и SetBatchLines

Не обязательно, датчиков может и не быть. Это может быть просто программа (Task), которой назначено определенное время выполнения задачи. Зависит от быстродействия CPU. В ПЛК это обязательно, т.к. это realtime система, т.е. должно быть гарантировано время реакции на события. Если время выполнения задачи превышает время цикла (например, при использовании оператора цикла FOR/LOOP, т.е. будет цикл в цикле), то происходит сбой и надо увеличить время цикла. В контексте AHK это главный скрипт это главный Task ПЛК, а подпрограммы это другие Tasks, которые могут иметь другое время цикла.

Вот только тут непонятно написано:

Milliseconds
    An integer immediately followed by "ms" to specify how often the script should sleep (each sleep is 10 ms long). In the following example, the script will sleep for 10 ms every time it has run for 20 ms: SetBatchLines, 20ms.

Тут 20мс это время выполнения, отведенное на задачу, а 10 мс пауза?

11 (изменено: stuermer, 2023-07-17 18:28:21)

Re: AHK: Вопрос по тредам и SetBatchLines

teadrinker пишет:

SetBatchLines определяет, насколько часто во время выполнения потока будет вставляться пауза в 10 мс. Это определяется для каждого потока.

Если есть пауза между повторными выполнениями потока, то это и есть цикл. Только SetBatchLines, похоже, определяет паузу между выполнениями, а не время, отведенное на выполнение задачи потока.

12 (изменено: stuermer, 2023-07-17 18:29:17)

Re: AHK: Вопрос по тредам и SetBatchLines

ypppu пишет:

ПЛК - так в русскоязычном интернете порой называют PLC. Это такая железяка для широкого спектра задач. На каждую задачу надо писать алгоритм. Снаружи имеет входы для подключения всяких-разных датчиков и выходы для управляющих/сигнализирующих устройств. Используется в промышленности для автоматизации технологических процессов. ПЛК бывают от разных фирм и разных моделей, какого-то единого языка программирования для них не существует. Если купишь какой-то другой ПЛК - придётся изучать всё по новой.

Не придется, есть стандарт IEC 61131-3, его придерживаются разные производители PLC. В нем есть язык программирования ST (Structured Text), который есть смесь С/С++ и Pascal. Например, среда разработки Codesys подходит к 350 производителям PLC в Германии. Каждый производитель PLC этот софт под себя брендирует.

13

Re: AHK: Вопрос по тредам и SetBatchLines

А для чего вам вообще нужен SetBatchLines?
Я, например, ни разу его не менял.

14 (изменено: stuermer, 2023-07-17 18:45:43)

Re: AHK: Вопрос по тредам и SetBatchLines

Да, похоже на то, что SetBatchLines и не нужен, потому, что если надо снизить нагрузку на проц, то можно задать время отведенное, на выполнение задачи потока подпрограммы таймером. Т.е. задача выполнится и поток все равно будет стоять и ждать, пока отведенное время истечет. И не надо паузу делать дополнительно.
А если таймера нет, например для основного скрипта, то время выполнения по умолчанию, наверное, 20ms.

15

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer пишет:

Если есть пауза между повторными выполнениями потока, то это и есть цикл

Нету никаких повторных выполнений потока. SetBatchLines определяет именно то, что я написал, ничего другого.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Вопрос по тредам и SetBatchLines

Malcev пишет:

Я, например, ни разу его не менял.

Почему, вот здесь, например, менял.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17 (изменено: stuermer, 2023-07-17 20:24:37)

Re: AHK: Вопрос по тредам и SetBatchLines

teadrinker пишет:

Нету никаких повторных выполнений потока. SetBatchLines определяет именно то, что я написал, ничего другого.

Вы написали то, что написано в справке:

SetBatchLines определяет, насколько часто во время выполнения потока будет вставляться пауза в 10 мс.

Если поток непрерывный, значит вставляется пауза 10 мс, каждые хх мс во время его выполнения. Это и есть симуляция повторного выполнения задачи PLC.

18

Re: AHK: Вопрос по тредам и SetBatchLines

teadrinker пишет:

Почему, вот здесь, например, менял.

Я имел в виду, что не менял после первоначальной установки.

19

Re: AHK: Вопрос по тредам и SetBatchLines

Формально начальное значение уже установлено — 10ms, значит любое применение SetBatchLines в скрипте его меняет.

stuermer пишет:

симуляция повторного выполнения задачи

Нет, вы неверно это понимаете. Нет никакого повторного выполнения задачи, поскольку никакой задачи, подобной той, что вы описываете в PLC, в AHK-скрипте не существует. Просто идёт выполнение потока, и раз в какое-то время вставляется пауза, после этого поток продолжается (а не выполняется повторно).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer пишет:

Вопрос: Если нужно, чтобы новый тред таймера был медленнее, то будет ли работать так:

В этом вопросе что ты имеешь ввиду? Чтобы очередность выполнения строк от "TWait:" до "return" была медленнее или то как часто повторяется "TWait:"?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

21

Re: AHK: Вопрос по тредам и SetBatchLines

teadrinker пишет:

Формально начальное значение уже установлено — 10ms, значит любое применение SetBatchLines в скрипте его меняет.

stuermer пишет:

симуляция повторного выполнения задачи

Нет, вы неверно это понимаете. Нет никакого повторного выполнения задачи, поскольку никакой задачи, подобной той, что вы описываете в PLC, в AHK-скрипте не существует. Просто идёт выполнение потока, и раз в какое-то время вставляется пауза, после этого поток продолжается (а не выполняется повторно).

SetBatchLines определяет именно то, что я написал, ничего другого. См. пост 17.
Вы не читаете, что я пишу. Вы повторили то же самое.
Повторного выполнения нет, но есть его симуляция. SetBatchLines это симуляция длительности цикла PLC для компьютера. AHK это автоматизация компьютера.

22

Re: AHK: Вопрос по тредам и SetBatchLines

Alectric пишет:
stuermer пишет:

Вопрос: Если нужно, чтобы новый тред таймера был медленнее, то будет ли работать так:

В этом вопросе что ты имеешь ввиду? Чтобы очередность выполнения строк от "TWait:" до "return" была медленнее или то как часто повторяется "TWait:"?

Мы с тобой за одной партой сидели?

23

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer пишет:

SetBatchLines это симуляция длительности цикла PLC для компьютера.

Да нет никакой симуляции. Но если вам нравится так думать, никто не может вам помешать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24 (изменено: Alectric, 2023-07-19 19:39:18)

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer пишет:

Мы с тобой за одной партой сидели?

Я просто тоже ПЛК программирую. И заметил разницу: говорим с программистами об одном и том-же, но предложения строим иначе - в итоге не понимаем друг друга. В таких ситуациях нужен уточняющий вопрос "о чем мы говорим то", я его и задал.

А вообще я с SetBatchLines не парюсь и ставлю "-1", что значит максимально быстрое выполнение и там где нужно выставляю задержки (sleep или "счетчик миллисекунд на переменной").

Таймер сам для себя создает задержку если выполнил все команды быстрее чем указано его время (при этом он отдает контроль основному "потоку" через return (почитай справку по потокам)), если он не успевает - всё равно все выполнит до конца не зависимо от времени, только если другой таймер или горячая кнопка не прервет его выполнение.

setbatchlines,-1

i:=0
settimer,timer,1000 ; больше похоже на прерывание по времени в ПЛК

loop ; основной цикл ПЛК
{
  tooltip % "j=" a_index,40,600,3
  sleep,100
}
return

timer:
i++
loop,100
{
  tooltip % a_index,100,600,2
;  sleep,100   ; раскоментируй эту строку чтобы понять что будет если таймер не успеет
}
tooltip % "i=" i,140,600,1
return

f1::
i:=0
tooltip % "f1 нажата`ni=" i,140,600,1
return

esc::
exitapp
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

25

Re: AHK: Вопрос по тредам и SetBatchLines

teadrinker пишет:

Да нет никакой симуляции. Но если вам нравится так думать, никто не может вам помешать.

Есть. Сначала был PLC для автоматизации машин. Задолго до AHK. Потом по его образу и подобию создали AHK для автоматизации ПК. Зачем иначе нужна SetBatchLines? Чтоб просто проц разгрузить достаточно Sleep() использовать.

26

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer пишет:

Потом по его образу и подобию создали AHK для автоматизации ПК.

Это тоже ваши фантазии. AHK создан по образу и подобию AutoIt. Но, опять же, фантазировать вам никто не может запретить. Другое дело, что фантазии вам иногда могут мешать понимать простые вещи.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK: Вопрос по тредам и SetBatchLines

Alectric
Если ты PLC программируешь, это еще не значит, что ты в этом что-то понимаешь.
Таймер это настоящий цикл PLC, потому, что там есть реально повторное выполнение подпрограммы. Если запустить отладчик AHK и делать Refresh то это будет видно. А SetBatchLines это симуляция цикла, чтобы было похоже на PLC. Если есть и таймер и SetBatchLines то поток подпрограммы будет прерываться. То, что таймер сам себе задержку создает, если быстрее выполнит подпрограмму, я писал.
То, что ты написал, это цикл в цикле. Потому, что у тебя loop в таймере.

28

Re: AHK: Вопрос по тредам и SetBatchLines

teadrinker Значит AutoIt создан создан по подобию PLC, а AHK это следующая производная. Наверняка там тоже есть такой функционал.
Фантазия - очень полезная вещь в жизни.

"Узкий специалист подобен флюсу: полнота его односторонняя."
Козьма Прутков

29

Re: AHK: Вопрос по тредам и SetBatchLines

Нет, AutoIt создан по подобию BASIC. Но BASIC то уж точно создан по подобию PLC, зуб даю.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

30

Re: AHK: Вопрос по тредам и SetBatchLines

teadrinker Я AutoIt не знаю. Речь шла о том, что SetBatchLines это аналог длительности цикла в PLC.
Другой пример - функции WinWaitActive. Это то же самое, что графический язык программирования Motion Chart в системе Simotion фирмы Siemens. Управление системами позиционирования.

31 (изменено: stuermer, 2023-07-20 20:12:10)

Re: AHK: Вопрос по тредам и SetBatchLines

teadrinker пишет:

Но BASIC то уж точно создан по подобию PLC, зуб даю.

Basic не создан по подобию PLC. В вашей стране лучше так не шутить. За такие заявления, можно действительно зуба лишиться)).

32

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer пишет:

Basic не создан по подобию PLC

Как же так? Ведь всё создано по подобию PLC, значит и Basic тоже!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

33 (изменено: Alectric, 2023-07-20 22:24:23)

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer пишет:

Таймер это настоящий цикл PLC, потому, что там есть реально повторное выполнение подпрограммы

Нет. Таймер это прерывание по времени, потому, что он прерывает основной поток чтобы выполнить код подпрограммы. https://prog-cpp.ru/micro-interrupts/
Это в кодесисе таймер это цикл ПЛК, и то это можно перенастроить на "свободное выполнение" и программа будет выполняться в любое удобное для нее время, если у процессора будет свободное время.

stuermer пишет:

То, что ты написал, это цикл в цикле. Потому, что у тебя loop в таймере.

Loop в таймере это чтобы "симулировать" долгое время выполнения кода подпрограммы таймера, вместо этого "loop" вообрази, фантазией, много строк полезного кода.

OFF: Напоминаешь ты мне одного товарища, который любит поспорить просто чтобы поспорить, даже если понимает что неправ.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

34

Re: AHK: Вопрос по тредам и SetBatchLines

Alectric пишет:

Нет. Таймер это прерывание по времени, потому, что он прерывает основной поток чтобы выполнить код подпрограммы. https://prog-cpp.ru/micro-interrupts/

Так это в переносном смысле написано. У тебя тоже фантазии нету. Таймер это АНАЛОГ цикла ПЛК. Потому, что повторное выполнение. Ясно, что ПЛК это не ПК. Невозможно спорить с ограниченными людьми без фантазии.

Это в кодесисе таймер это цикл ПЛК

В Codesys таймер это таймер, а цикл это цикл.
А в AHK таймер это цикл ПЛК - в переносном значении!

35

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer
Я бы посмотрел на ситуацию с другого ракурса: вы научились когда-то программированию PLC, и теперь всё время пытаетесь натянуть эту сову на любой глобус. Как говорится, старую собаку новым трюкам научишь. Может, это как раз вам немного не хватает фантазии?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

36

Re: AHK: Вопрос по тредам и SetBatchLines

Говориться так: "ни ума, ни фантазии".
Как я уже писал, в вашей стране "за базар" надо отвечать. Поэтому фразу про зуб удалите, пока этим никто не воспользовался.

37

Re: AHK: Вопрос по тредам и SetBatchLines

Ну вот видите, ваша пресловутая фантазия даже не позволила вам сообразить, что про происхождение BASIC от PLC это была шутка. Честно говоря, я думал, что вы были способны её понять.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

38

Re: AHK: Вопрос по тредам и SetBatchLines

Есть еще и Soft-PLC на промышленных ПК под Windows, с кнопками как на клавиатуре.
И визуализация, например WinCC - со скриптами VBScript, но это уже если дальше развивать тему.

Вы по делу аргумент не опровергли: Зачем нужен SetBatchLines, если есть Sleep()? Если PLC тут и не пахнет.

39

Re: AHK: Вопрос по тредам и SetBatchLines

Начнём с того, что SetBatchLines вообще сейчас не особо нужен, это наследие древних версий AHK или AutoIt. Возможно раньше, когда процессоры были менее мощными, использование пауз в процессе выполнения потока имело смысл, чтобы снизить нагрузку на процессор. В актуальной версии AHK (v2) по умолчанию паузы вообще не вставляются и SetBatchLines не используется. С другой стороны, в высоконагруженных циклах всё равно чаще всего нужно вставлять Sleep.
В чём отличие от Sleep? SetBatchLines — это более общая настройка, один раз установил, и не паришься, а Sleep бы пришлось постоянно вставлять в разные места скрипта.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

40

Re: AHK: Вопрос по тредам и SetBatchLines

stuermer пишет:

Зачем нужен SetBatchLines, если есть Sleep()? Если PLC тут и не пахнет.

stuermer пишет:

Если время выполнения задачи превышает время цикла (например, при использовании оператора цикла FOR/LOOP, т.е. будет цикл в цикле), то происходит сбой и надо увеличить время цикла.

В AutoHotkey нет такого понятия, как "превысить время цикла". Тут команда выполняется до тех пор, пока она не будет выполнена, сколько бы времени на это ни пришлось потратить.

В AutoHotkey принято между окончанием выполнения одной команды и началом выполнения другой команды вставлять небольшой перерывчик: если ничего в скрипте не прописывать, SetBatchLines = 10 мс. Эту настройку можно менять.
Чтобы этот перерывчик сделать как можно меньше, следует прописать SetBatchLines -1. При таких настройках скрипт станет выполнять команды вообще без перекуров. При этом, когда задача достаточно объёмная, в Диспетчере задач наблюдается загрузка процессорного ядра до 100%.

41

Re: AHK: Вопрос по тредам и SetBatchLines

ypppu пишет:

В AutoHotkey принято между окончанием выполнения одной команды и началом выполнения другой команды вставлять небольшой перерывчик: если ничего в скрипте не прописывать, SetBatchLines = 10 мс. Эту настройку можно менять.
Чтобы этот перерывчик сделать как можно меньше, следует прописать SetBatchLines -1

Это всё неверно. Прочитай внимательнее справку.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder