Синхронизация затраченного времени в методе combined.run
Одной из особенностей метода run является то, что он проводит синхронизацию по времени
выполнения скрипта и реально затраченного времени.
Приведем пример: имеется список событий, где записаны различные действия "ld#Ld#k#d#K#d#",
используя список событий можно понять, что тут происходит нажатие и отпускание левой кнопки мыши и нажатие и
отпускание какой-то клавиши клавиатуры. Переведем эту строку к более наглядному виду и заполним неизвестные
параметры:
"ld#Ld#k#d#K#d#" >>>
mouse.press('LEFT');
system.sleep(30);
mouse.release('LEFT');
system.sleep(45);
key.press('A');
system.sleep(100);
key.release('A');
system.sleep(35);
Между каждым событием присутствует задержка в виде system.sleep(ms). Теоретическое время выполнение скрипта будет равно сумме всех указанных задержек методом system.sleep() – 30 + 45 + 100 + 35 = 210мс. Время за которое данный скрипт выполнится на самом деле, будет немного больше (плюс время выполнение самого скрипта и внутренние задержки объектов), что будет вносить нежелательное отклонение от реального времени. Для компенсации разницы во времени, данная разница вычитается из времени метода system.sleep() после каждого события. Приведем пример.
mouse.press('LEFT');
system.sleep(50);
mouse.release('LEFT');
system.sleep(50);
Одно событие зажатия левой кнопки мыши и задержка следующая после него. Аналогично для отпуская копки. Посчитаем время выполнения данного кода.
mouse.press('LEFT');
mouse.pressDelay = 10 мс.
mouse.releaseDelay = 10 мс.
mouse.press('LEFT'); // 10 мс.
system.sleep(50); // 50 мс.
mouse.release('LEFT'); // 10 мс.
system.sleep(50); // 50 мс.
Указанное время выполнения = 50 + 50 = 100 мс.
Фактическое время выполнения = 10 + 50 + 10 + 50 = 120 мс. + (накладные расходы)
Разница времени выполнения = 120 - 100 = 20 мс.
В такой ситуации фактическое время выполнения будет не менее 120 мс., а с учетом накладных расходов и того
больше. Под накладными расходами подразумевается время выполнения самого кода программой.
Для того чтобы убрать это несоответсвие, программа при выполнении метода run компенсирует время
выполнения отнимая нежелательную разницу из метода system.sleep(), фактически, будет выполнен
следующий код.
mouse.press('LEFT'); // 10 мс.
system.sleep(40); // 50 - 10 = 40 мс.
mouse.release('LEFT'); // 10 мс.
system.sleep(40); // 50 - 10 = 40 мс.
Таким образом, время выполнения скрипта будет соответствовать реальному времени. Но как всегда, есть ограничения.
Что произойдет, если время самого события будет меньше чем доступное время для компенсации? Посмотрим на пример.
mouse.pressDelay = 10 мс.
mouse.releaseDelay = 10 мс.
mouse.press('LEFT'); // 10 мс.
system.sleep(8); // 8 мс.
mouse.release('LEFT'); // 10 мс.
system.sleep(8); // 8 мс.
Указанное время выполнения = 8 + 8 = 16 мс.
Фактическое время выполнения = 10 + 8 + 10 + 8 = 36 мс. + (накладные расходы)
Разница времени выполнения = 36 - 16 = 20 мс.
В данной ситуации получается, что разница во времени больше, чем время, которое возможно компенсировать вычитанием из метода system.sleep(). В данной ситуации из метода system.sleep() вычитается максимально возможное время, а остаток будет вычтен из следующего события.
mouse.press('LEFT'); // 10 мс.
system.sleep(0); // 8 - 10 = 0 мс. (остаток = 2)
mouse.release('LEFT'); // 10 мс.
system.sleep(0); // 8 - 10 = 0 мс. (остаток = 4)
Если и из следующего события не получится вычесть нужное время, то остаток будет накапливаться, но он всегда будет ограничен параметром combined.maxDelayDiff (стандартное значение для combined.maxDelayDiff = 100 мс.).