Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Annihilant on November 05, 2015, 08:45:47 AM
-
Ошибка при интерпретации строки TFWRITE("otchet.txt", STRCONCAT($dd,".",$dm,".",$dy," ",$th,":",$tm,":",$ts, " ", $note))
продолжить выполнение?
SUB(LOG,$note) // подпрограмма лога с датой
//укорачиваем переменные
$th = $_time_h
$tm = $_time_m
$ts = $_time_s
$dd = $_date_d
$dm = $_date_m
$dy = $_date_y
//проверяем переменные на двузначность
IF(STRLEN($th)<2)
$th = STRCONCAT ("0", $th)
END_IF
IF(STRLEN($tm)<2)
$tm = STRCONCAT ("0", $tm)
END_IF
IF(STRLEN($ts)<2)
$ts = STRCONCAT ("0", $ts)
END_IF
IF(STRLEN($dd)<2)
$dd = STRCONCAT ("0", $dd)
END_IF
IF(STRLEN($dm)<2)
$dm = STRCONCAT ("0", $dm)
END_IF
IF(STRLEN($dy)<2)
$dy = STRCONCAT ("0", $dy)
END_IF
TFWRITE("otchet.txt", STRCONCAT($dd,".",$dm,".",$dy," ",$th,":",$tm,":",$ts, " ", $note)) // запись в файл
END_SUB
но не постоянно а как то изредка. В чем может быть проблема?
-
часто пишешь, нет задержек или они маленькие.
Без задержки очень быстро скрипт пытается писать в ещё заблокированный файл.
-
Ок, попробую увеличить временные отрезки.
-
Ок, попробую увеличить временные отрезки.
К сожалению, это не поможет. КМ должен иметь монопольный доступ к файлу с которым работает. Он не начнет новую запись в файл, пока функция TFWRITE, в данном случае, не отработает до конца и не вернет код ошибки, то есть результат своей работы. И если результат выполнения функции - ошибка, то КМ приостановит выполнение скрипта и сообщит об этом пользователю. Поэтому задержки тут не при чем. И если какой то программе, параллельно с КМ, требуется открывать файл "otchet.txt" для чтения/записи, то они должны обмениваться кодами ошибок, что бы синхронизировать свою работу.
Например, после запуска bat-файла из скрипта, cmd.exe может сообщить Clickermann'у об окончании своей работы через буфер обмена. Для этого bat-файл должен завершаться соответствующей строкой, например CLS | clip. Clickermann в свою очередь, будет в цикле проверять буфер обмена и ждать появления в нем характерного символа, и после его обнаружения продолжит выполнение сценария (либо выполнит какое то определенное действие, если превышен интервал ожидания).
Еще можно попробовать решить проблему, если в настройках КМ поставить галочку "Игнорировать ошибки".
-
По моему в условии и так никто кроме кликера в файл не пишет.
Как то, по просьбе, делал скрипт, который пересчитывал в записанном сценарии все задержки в n раз.
Скрипт пробегал по строкам и найдя WAIT или WAITMS делал пересчёт и писал на то же место.
При работе скрипт падал на строке записи. То после 300 строк, то после 500... больше 700 кажется ни разу не проскочил.
Поставив минимальную задержку в 5 мс на каждом цикле обработки строки всё наладилось и скрипт стал благополучно перерабатывать файлы в несколько тысяч строк.
Тут даже дело не в монопольном доступе, потому что кликер работает один, а в буферизации записи на диск контролируемой виндой.
Винда берёт данные на запись и рапортует программе что всё OK и завершено, отпуская её тем самым на волю. Этот механизм ускоряет работу программ при работе с медленным диском.
Из-за одновременных запросов на запись к системе, очередь имеет разную длину ну и соответственно до нашей записи когда время дойдёт не предсказуемо. Чем меньше нагрузка на комп тем лучше.