Как из веб-интерфейса передать данные в потоки?
-
Юзаю стандартный интерфейс. ДО нажатия на "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" по атрибуту