Общая переменная на все потоки

Регистрация
23.03.2015
Сообщения
1 273
Благодарностей
832
Баллы
113
Постараюсь понятно объяснить что я хочу.
В шаблоне определённые действия выполняются раз в 15 минут, это действие нужно делать один раз в эти 15 минут, а шаблон запускается минимум в пять потоков. Вот нужно сделать чтобы когда один поток начал делать, другие чтобы ни в коем случае не повторяли.
Самый простой способ сделать через файл, но тут есть нюанс.
Один и тот же шаблон загружается в ЗП несколько раз и работают они параллельно. По этой причине и глобальные переменная не подойдёт.
Соответственно мне бы как-нибудь сделать такую-то глобальную переменную, которую Видели бы только потоки одного шаблона.
А если в этот шаблон запустить рядом с другим названием, то его потоки создавали бы для себя отдельную переменную.
Есть у кого-нибудь идеи как такое реализовать?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 615
Благодарностей
3 423
Баллы
113
когда один поток начал делать, другие чтобы ни в коем случае не повторяли.
Объект в глобальной переменной можно использовать как метку для блокировки.
По хорошему, стоило бы всю логику шаблона запихать в lock, но его м.б. достаточно в начале шаблона, при организации правильного цикла проверки статуса занятости в глоб. переменной.
 
Последнее редактирование:
  • Спасибо
Реакции: KolkaPetkinSyn

Alex733

Client
Регистрация
27.11.2017
Сообщения
346
Благодарностей
247
Баллы
43
Namespace для глобальной переменной используй или по project.TaskId или по имени шаблона, который можно взять из:
C#:
ZennoPoster.GetTaskInfo(Guid.Parse(project.TaskId));
 
  • Спасибо
Реакции: KolkaPetkinSyn

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 615
Благодарностей
3 423
Баллы
113
 
  • Спасибо
Реакции: KolkaPetkinSyn
Регистрация
23.03.2015
Сообщения
1 273
Благодарностей
832
Баллы
113
Объект в глобальной переменной можно использовать как метку для блокировки.
По хорошему, стоило бы всю логику шаблона запихать в lock, но его м.б. достаточно в начале шаблона, при организации правильного цикла проверки статуса занятости в глоб. переменной.
Я правильно понимаю, Если взять сниппет по ссылке и namespaceName присвоить "ZennoPoster.GetTaskInfo(Guid.Parse(project.TaskId));", то теоретически всё должно получиться?
 

Nersd

Client
Регистрация
14.02.2019
Сообщения
114
Благодарностей
10
Баллы
18
я просто делаю дубли проекта с разными файлами:bm:
 
Последнее редактирование:
  • Спасибо
Реакции: KolkaPetkinSyn
Регистрация
23.03.2015
Сообщения
1 273
Благодарностей
832
Баллы
113
да просто через список, сохраняйте что то например цифру 1 в список перед началом выполнения действия, а после выполнения отчищайте список или пишите 0, и также сохраняйте в файл, и перед выполнением просто проверяете значение в файле 0 или 1, если 0 выполнять 1 ждать
В принципе рабочий вариант. Я раньше в таких случаях так и поступал. Но здесь один и тот же шаблон добавляется в постер несколько раз. Соответственно нужно будет делать отдельный файл для каждой копии. Это дополнительный мусор в папке с шаблоном. Вариант выше с отдельной глобальной переменной мне больше нравится.
 

Nersd

Client
Регистрация
14.02.2019
Сообщения
114
Благодарностей
10
Баллы
18
В принципе рабочий вариант. Я раньше в таких случаях так и поступал. Но здесь один и тот же шаблон добавляется в постер несколько раз. Соответственно нужно будет делать отдельный файл для каждой копии. Это дополнительный мусор в папке с шаблоном. Вариант выше с отдельной глобальной переменной мне больше нравится.
можно в один файл но в разные строки :bm:
можно даже шаблоны не дублить, а также через счетчик и файл чтоб каждый проект по счетчику брал свою строку. :bm:
и все это через один файл :bm: можно наколхозить что то страшное:D
 
Последнее редактирование:

eleele

Client
Регистрация
26.01.2022
Сообщения
24
Благодарностей
7
Баллы
3
С глобальными переменными почему не работает? В настройках шаблона добавьте поле с текстом разным и его используйте в создании переменной.


lock(SyncObject)
{
bool wait = false;
try
{
IGlobalVariable gb = project.GlobalVariables["profile", project.Variables["folder"].Value];

if (Convert.ToInt32(gb.Value) != 0) wait = true;
}
catch (KeyNotFoundException ex) {}

if (wait) throw new Exception();
project.GlobalVariables.SetVariable("profile", project.Variables["folder"].Value, 1);
}
 

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