Как получить одно значение во все потоки?

dmitlife

Client
Регистрация
25.04.2019
Сообщения
43
Благодарностей
26
Баллы
18
Приветствую! Помогите пожалуйста найти решение.
Необходимо в многопотоке получить первую строку из списка с удалением и передать её всем действующим потокам.
После определённого действия в шаблоне, нужно снова взять новую строку и передать её всем потокам и делать так пока список не закончится.
То есть с одной строкой должны работать сразу все потоки которые активны.

Подумал, что логика такая - Лочим один поток, он берёт строку из списка с удалением и кладёт в глобальную переменную, а другие потоки считывают глобальную переменную и кладут значение в локальную. Но не получается что-то.

Нашёл код на форуме, но в C# не силён. Всё равно потоки берут разные значения.
Пытаюсь использовать код:
C#:
lock(project.GlobalVariables){
    var list = project.Lists["Список"];
    string rx = list[0];
    project.GlobalVariables.SetVariable("domen", "value", rx);
    project.Lists["Список"].RemoveAt(0);
}

// Текст для обработки
string text = project.ExecuteMacro(project.GlobalVariables["domen", "value"].Value);
// Обработка текста "В переменную"
project.Variables["res"].Value = text;
Как правильно решить мою задачу?
Спасибо за помощь!
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 724
Баллы
113
в локе сначала надо глобалку проверить есть ли там что. если есть, то не трогать список, выходить и работать с данными из глобалки.
если в глобалке пусто, то брать данные из списка. и ставить в глобалку.
определенное действие в шаблоне, должно обнулять глобалку. опять же в локе и с проверкой наличия данных.

незнаю как ты собираешься синхронизировать получение новых данных и те потоки которые еще не дошли до определенного места для сброса. без синхронизации, у тебя будет полный кабздец с данными.
 
  • Спасибо
Реакции: dmitlife

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 531
Благодарностей
3 377
Баллы
113

Misha

Client
Регистрация
23.10.2016
Сообщения
260
Благодарностей
72
Баллы
28

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 531
Благодарностей
3 377
Баллы
113
Добрый день, а мы можем создать глобальный список?
Только если хранить ссылку на список одного из шаблонов в глоб. переменной, но такой шаблон не должен завершаться.
 
Регистрация
05.06.2019
Сообщения
581
Благодарностей
460
Баллы
63
1. Перейти в "Директивы using и общий код"
2. Использовать публичный статический список

C#:
namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
        public static List<T> MyList = new List<T>();
    }
}
Примечание: Где <T>, указываете нужный вам тип.
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
496
Благодарностей
130
Баллы
43
Ничоси накидали вредных советов :-)

Конечно можно запихнуть список в глобалку, и не только список, а любую свою структуру, даже с исполняемым кодом.
Вот для списка вообще лишних телодвижений не надо, просто создаешь глобалку как список. Так как это стандартная структура на уровне всей программы, то доступ получишь из всех шабов и без ошибок.
А если хочешь свою структуру поместить в глобалку, то тебе надо создать отдельную DLL в визуал студии и подключить в каждый шаблон, где хочешь ее использовать. Тогда не будет ошибок. И просто создаешь глобалку как объект из своей DLL.

То что выше кинули в общем коде, это конечно можно с натяжкой на глобус назвать "глобальным вариантом"... Но вся глобальность только в этом же шаблоне и его порожденных потоках. Другие шаблоны , с другими именами, будут иметь свою копию статики. Если интересно, гугли uid объекта компиляции c#
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)