Добавил еще ведущие нули к миллисекундам, если кому-то еще когда-то этот код понадобится
log = function (text, color, define){ var id, time, thread, logHtml, textLog; define = (typeof define == 'string') ? define.split(/[\s,.|:;]+/g) : define; if(typeof define === 'object' && define !== null){ if(Array.isArray(define)){ id = define.indexOf('id') > -1; time = define.indexOf('time') > -1; thread = define.indexOf('thread') > -1; } else{ id = define.id == true; time = define.time == true; thread = define.thread == true; } } else id = time = thread = true; id = id ? '<a href="action://action' + ScriptWorker.GetCurrentAction() + '" style="color:gray;">[' + ScriptWorker.GetCurrentAction() + ']</a>' : ''; time = time ? ' ' + getTime() : ''; thread = thread ? ' Поток №' + thread_number() : ''; logHtml = (id || time || thread) ? id + '<span style="color: white">' + time + thread + ' : </span>' : ''; logHtml += '<span style="color:' + (color ? color : 'white') + '">' + text + '</span>'; textLog = '[' + ScriptWorker.GetCurrentAction() + ']' + time + thread + ' : ' + text function getTime(){ var checkTime = function(i){ return (i < 10) ? "0" + i : i; }; var checkMilliSeconds = function(ms){ if (ms < 10) { return "00" + ms; } else if (ms < 100) { return "0" + ms; } else { return ms; } }; var d = new Date(); var hh = checkTime(d.getHours()); var mm = checkTime(d.getMinutes()); var ss = checkTime(d.getSeconds()); var ms = checkMilliSeconds(d.getMilliseconds()); return '[' + hh + ':' + mm + ':' + ss + '.' + ms + ']'; }; Logger.WriteHtml(logHtml, textLog); }Как из веб-интерфейса передать данные в потоки?
-
Юзаю стандартный интерфейс. ДО нажатия на "Run" формирую некоторые данные, и нужно передать их в потоки. Второй день читаю документацию, перепробовал все варианты - ничего не работает. Глобал переменные создавать нельзя до старта, вот еще что пробовал:
Создал простую функцию в басе (ADD), которая принимает 2 параметра: name, data; создает ресурс name и добавляет в него data.Затем вызываю функцию из веб-интерфейса:
await Api.RunFunction("ADD", {name: "testRes", data: "123"})Результат: потоки крашатся с ошибкой: Все данные были обработаны для testRes
Пробовал явно создать ресурс testRes, и в функции просто закинуть в него параметр data.
Результат - ресурс testRes всегда пустой.Уже хочется комп разбить, или бас удалить, почему код не работает?
Задача самая элементарная: передать переменную в потоки. -
@arcos Сохраняй локально в текстовик. Например:
name: "testRes", data: "123"Если надо распределить это значение только один раз по всем потокам, можно использовать запись номера потока в этот текстовик. Например:
2pot; name: "testRes", data: "123"Где: 2pot; - запись от первого потока. Если будет этот текст, то второй поток возьмёт эти данные и после перезапишет 2pot; на 3pot;
Последний поток после использования данных из текстовика удаляет его. -
@arcos said in Как из веб-интерфейса передать данные в потоки?:
Юзаю стандартный интерфейс.
В BAS есть стандартный интерфейс и веб интерфейс. Веб интерфейс ещё подразделяется на сгенерированный и пустой интерфейс
ДО нажатия на "Run" формирую некоторые данные, и нужно передать их в потоки. Второй день читаю документацию, перепробовал все варианты - ничего не работает. Глобал переменные создавать нельзя до старта, вот еще что пробовал:
Создал простую функцию в басе (ADD), которая принимает 2 параметра: name, data; создает ресурс name и добавляет в него data.Затем вызываю функцию из веб-интерфейса:
await Api.RunFunction("ADD", {name: "testRes", data: "123"})Результат: потоки крашатся с ошибкой: Все данные были обработаны для testRes
Пробовал явно создать ресурс testRes, и в функции просто закинуть в него параметр data.
Результат - ресурс testRes всегда пустой.Уже хочется комп разбить, или бас удалить, почему код не работает?
Задача самая элементарная: передать переменную в потоки.Какие то ужасти описываете. Не совсем понятно зачем создавать ресурс, вызывать функцию.. Если вы используете сгенерированный веб интерфейс, значит в интерфейсе есть кнопка "Старт", значит тип повторения, количество потоков, всё настроено в скрипте. Значит распределять данные в потоках проще всего через ресурсы, но раз у вас интерфейс генерирует поля, то данные проще собрать в объект, передать объект в виде json строки через ресурс с типом "строка", что бы в функции "OnApplicationStart" распарсить json строку и заполнить локальный ресурс, который уже будет использоваться в остальных потоках.
На случай если возникнут проблемы с vue, вот реализация добавления инпутов на js: https://codepen.io/FoxV/pen/JjmVJgw
Теперь по шагам:
- Создаём скрипт с ресурсом res1 и типом строка, сохраняем и загружаем на сервер. Далее генерируем веб интерфейс, открываем его для редактирования, находим в окне html элемент ресурса "res1" по атрибуту
data-resource-name="res1", добавляем в него атрибутhidden="true"что бы спрятать. После этого элемента добавляем кнопку с контейнером
<button id="createInput">Create Input Field</button> <div id="input-container"></div>- В окне js добавляем обработчик клика:
var inputCount = 0; $("#createInput").on("click", function () { inputCount++; var span = document.createElement("span"); span.class = "block" var div = document.createElement("div"); var container = document.getElementById("input-container"); var input = document.createElement("input"); input.type = "text"; input.className = "test_resource"; input.id = "input-" + inputCount; div.appendChild(input); span.appendChild(div); var deleteButton = document.createElement("button"); deleteButton.innerHTML = "Delete"; deleteButton.onclick = function () { container.removeChild(span); }; div.appendChild(deleteButton); span.appendChild(div); container.appendChild(span); })- Затем находим функцию "GetResourceValue", добавляем код для получения значений всех созданных инпутов и отправки их в ресурс:
function GetResourceValue(ResourceName) { if (ResourceName == "res1") { var values = []; document.querySelectorAll('.test_resource').forEach(input => { values.push(input.value); }); return JSON.stringify(values); } return GetValue(ResourceName) }- Открываем скрипт BAS в режиме "записи", создаём функцию "OnApplicationStart", в ней создаём код для парсинга полученного массива из строки json, создаём локальный ресурс и заполняем его данными из массива:

Всё! Теперь в функции Main можно использовать локальный ресурс как обычный ресрус:

Тестовый скрипт: 2679.xml
Экспортированный интерфейс: qw2.main.interface.27_05_2023_13_03.txt - Создаём скрипт с ресурсом res1 и типом строка, сохраняем и загружаем на сервер. Далее генерируем веб интерфейс, открываем его для редактирования, находим в окне html элемент ресурса "res1" по атрибуту