Как из веб-интерфейса передать данные в потоки?



  • Юзаю стандартный интерфейс. ДО нажатия на "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


    Теперь по шагам:

    1. Создаём скрипт с ресурсом res1 и типом строка, сохраняем и загружаем на сервер. Далее генерируем веб интерфейс, открываем его для редактирования, находим в окне html элемент ресурса "res1" по атрибуту data-resource-name="res1", добавляем в него атрибут hidden="true" что бы спрятать. После этого элемента добавляем кнопку с контейнером
    <button id="createInput">Create Input Field</button>
    <div id="input-container"></div>
    
    1. В окне 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);
    })
    
    1. Затем находим функцию "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)
    }
    
    1. Открываем скрипт BAS в режиме "записи", создаём функцию "OnApplicationStart", в ней создаём код для парсинга полученного массива из строки json, создаём локальный ресурс и заполняем его данными из массива:

    a221e1d2-5664-430e-9bea-da6a32f11575-изображение.png

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


    Тестовый скрипт: 2679.xml
    Экспортированный интерфейс: qw2.main.interface.27_05_2023_13_03.txt


Log in to reply