Вот другой алгоритм и другое понимание задачи соответственно. Массив тут не нужен, да и второму потоку места не нашлось.
Каждое нажатие пробела на клавиатуре запоминается и ставится в очередь на "превращение" в левый клик мыши. Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия пробела (а не так, что первый клик через 2 секунды, а все остальные скопом, без задержек). После выполнения клика, его координаты удаляются из памяти, поэтому кликер не будет повторять клики дважды. Очередь обнуляется полностью, если небыло нажатий пробела в течение двух секунд. Задержки внутри цикла корректируются автоматически, но все равно большой точности учета времени добиться вряд ли получится. Не уверен, что второй поток даст бОльшую точность.
Результат работы скрипта см. в логе. Строку 24 , при надобности раскомментировать, строку 25 закомментировать.
LOGCLEAR
$delay = 2000 // через сколько миллисекунд кликер превратит нажатие пробела в левый клик
$step = 5 // как часто кликер будет проверять, что нажат пробел (в миллисекундах)
//--------------------------------
$str = ""
FOR($n = 0, $n < $delay / $step)
$str = STRCONCAT($str, ",;")
END_CYC
//--------------------------------
WHILE(1)
$t = $_ms
IF(ISKEYDOWN(#SPACE) = 1)
WHILE(ISKEYDOWN(#SPACE) = 1)
WAITMS(1)
END_CYC
$str = STRCONCAT($str, $_xmouse, ",", $_ymouse, ";")
ELSE
$str = STRCONCAT($str, ",;")
END_IF
//--------------------------------
$x = STRCUT2($str, 1, STRPOS($str, ",") - 1)
IF($x ! "")
$y = STRCUT2($str, STRPOS($str, ",") + 1, STRPOS($str, ";") - 1)
// LCLICK($x,$y)
LOGWRITE (STRCONCAT($x, ",", $y))
END_IF
//--------------------------------
$str = STRCUT2($str, STRPOS($str, ";") + 1, STRLEN($str))
WAITMS($step - ($_ms - $t)) // коррекция времени (вычитаем из задержки "step" время, затраченное на выполнение действий в цикле)
END_CYC
UPD: От нефиг-далать решил проверить насколько будет сбиваться время между пробелом и кликом при длительной работе скрипта.
Включил в свой скрипт вывод в лог, после строки 28 - $str = STRCUT2($str, STRPOS($str, ";") + 1, STRLEN($str)).
$loss_time = $_ms - $t
$actual_waiting = $step - ($_ms - $t)
LOGWRITE ("Потери - ", $loss_time, "ms")
LOGWRITE ("Задержка после коррекции - ", $actual_waiting, "ms")
LOGWRITE ("")
В логе:
22:25:33 Потери - 1ms
22:25:33 Задержка после коррекции - 4ms
22:25:33
22:25:33 Потери - 0ms
22:25:33 Задержка после коррекции - 5ms
22:25:33
22:25:33 Потери - 0ms
22:25:33 Задержка после коррекции - 5ms
22:25:33
22:25:33 Потери - 1ms
22:25:33 Задержка после коррекции - 4ms
Пауза в цикле четко удерживается равной заданному значению $step=5. Получается, что разбежка во времени, между нажатием пробела и левым кликом, для любой пары координат - в пределах 1 миллисекунды. Погрешность тут-же учитывается коррекцией времени и компенсируется для следующей итерации. Нормально так, учитывая что миллисекунда - атомарная единица возвращаемая системной переменной $_ms. Жаль что само нажатие паузы может быть довольно продолжительным и портит картину.