Инициализация глобальных переменных

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
2 разных шаблона "общаются между собой" с помощью глобальных переменных.
Вопрос
Как инициализировать эти переменные чтобы работать с ними (что их лочить нужно, это я понял) прошерстил форум, но задачу свою не решил.
Если делаю вот так:

C#:
int sum_wait_bots = 0;
sum_wait_bots = Convert.ToInt32(project.GlobalVariables["ProjectSports","wait_bot_1"].Value);
return sum_wait_bots;
то выдает ошибку "Выполнение действия CSharp OwnCode. Глобальная переменная ProjectSports.wait_bot_1 не инициализирована"

Если до этого запускаю код написанный rostonix то все работает, но появляется как бы дубль моей переменной (скрин прикреплен).

C#:
    lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["ProjectSports","wait_bot_1"];
        // go to bad exit if already initilized
        return null;
    }
    catch (KeyNotFoundException ex) {
        int defaultValue = 1;
        project.GlobalVariables.SetVariable("ProjectSports","wait_bot_1", defaultValue);
        project.Variables["Variable0"].Value = defaultValue.ToString();
        // go to good exit if we initilized
    }

//sum_wait_bots = sum_wait_bots + Convert.ToInt32(gbVar);
        }
Как мне заставить мои переменные объявленные в этом проекте работать? спасибо
 
Последнее редактирование:

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Хз что было, перезагрузил зенку и вроде как заработало... без инициализации дополнительной
 

Phoenix78

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

64817
 
  • Спасибо
Реакции: arbplv

doc

Client
Регистрация
30.03.2012
Сообщения
8 613
Благодарностей
4 601
Баллы
113

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18

doc

Client
Регистрация
30.03.2012
Сообщения
8 613
Благодарностей
4 601
Баллы
113

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Написал в поддержку, жду ответа.
и еще вопрос.
2 ситуации
1. Многопоток, когда я запускаю 1 шаблон и указываю 10 потоков в постере
2. Я беру один шаблон, копирую его 10 раз, называю эти скопированные шаблоны разными именами и запускаю каждый из них.
Для этих 2 ситуаций необходимо лочить глобальные переменные, если я работаю с глобальными переменными в каждом шаблоне? или во втором случае нет многопотока в понимании когда нужно лочить. Вся работа происходит в кубиках С#

Сейчас жду ответ как правильно лочить переменные
C#:
lock(SyncObject)
{
работа с глобальной переменной var_global_1;
}
или вот так
C#:
using (FileSyncObjects.ListSyncer.Lock())
{
работа с глобальной переменной var_global_1;
}
Или это одно и тоже...
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 613
Благодарностей
4 601
Баллы
113
Написал в поддержку, жду ответа.
и еще вопрос.
2 ситуации
1. Многопоток, когда я запускаю 1 шаблон и указываю 10 потоков в постере
2. Я беру один шаблон, копирую его 10 раз, называю эти скопированные шаблоны разными именами и запускаю каждый из них.
Для этих 2 ситуаций необходимо лочить глобальные переменные, если я работаю с глобальными переменными в каждом шаблоне? или во втором случае нет многопотока в понимании когда нужно лочить. Вся работа происходит в кубиках С#

Сейчас жду ответ как правильно лочить переменные
C#:
lock(SyncObject)
{
работа с глобальной переменной var_global_1;
}
или вот так
C#:
using (FileSyncObjects.ListSyncer.Lock())
{
работа с глобальной переменной var_global_1;
}
Или это одно и тоже...
Не важно 10 потоков или 10 шаблонов, важно, что они могут внести изменения в один момент времени, что может привести к конфликту. Для этого и нужен лок, чтобы выстроить очередь взаимодействия


SyncObject этот лок распространяется только строго на тот участок кода, в котором прописан. Грубо говоря, если есть 2 экшена c# в каждом из которых есть такой лок, то они не будут выстраивать общую очередь не то, что бы для всех проектов, а даже для этих двух экшенов одного проекта. 1й лок будет выстраивать очередь для действий в 1м экшене, 2й во втором.

Если нужно лок, который будет общим для всех участков кода, завёрнутых в лок, для всех проектов одновременно - нужно использовать FileSyncObjects.ListSyncer и еще парочку. О них уже написана статья, где-то тут её кидали недавно
 

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Не важно 10 потоков или 10 шаблонов, важно, что они могут внести изменения в один момент времени, что может привести к конфликту. Для этого и нужен лок, чтобы выстроить очередь взаимодействия


SyncObject этот лок распространяется только строго на тот участок кода, в котором прописан. Грубо говоря, если есть 2 экшена c# в каждом из которых есть такой лок, то они не будут выстраивать общую очередь не то, что бы для всех проектов, а даже для этих двух экшенов одного проекта. 1й лок будет выстраивать очередь для действий в 1м экшене, 2й во втором.

Если нужно лок, который будет общим для всех участков кода, завёрнутых в лок, для всех проектов одновременно - нужно использовать FileSyncObjects.ListSyncer и еще парочку. О них уже написана статья, где-то тут её кидали недавно
Мне важно лочить только глобальные переменные. Списки, таблицы ничего не надо, только глобальные перменные
поэтому везде где я с ними работаю в С# буду оборачивать в using(FileSyncObjects.ListSyncer.Lock()){работа с глобальной переменной var_global_1;} Так будет корректно работать?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 613
Благодарностей
4 601
Баллы
113
Мне важно лочить только глобальные переменные. Списки, таблицы ничего не надо, только глобальные перменные
поэтому везде где я с ними работаю в С# буду оборачивать в using(FileSyncObjects.ListSyncer.Lock()){работа с глобальной переменной var_global_1;} Так будет корректно работать?
не важно, списки или глобалки. Важна организация очереди.
lock(SyncObjects.ListSyncer){работа с глобальной переменной var_global_1;}
Так точно будет корректно
 
  • Спасибо
Реакции: arbplv

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
понял. Спасибо. Везде где буду обращаться к переменным буду оборачивать в lock(SyncObjects.ListSyncer)
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Беги от глобалок, перенеси логику в общую базу данных, лучше локальную.
 

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Беги от глобалок, перенеси логику в общую базу данных, лучше локальную.
почему? У меня не так много данных там передается. Упрощенная логика такая. Есть 2 шаблона один в однопотоке, второй в многопотоке. Первый нашел ссылку для перехода, засунул в глобальную переменную, второй взял (их штук 10) взяли эту ссылку и перешли, прогрузили все, засунунули в глобальные переменные по 1, при условии что все ок. Первый взял эти глобалки, сосчитал, если их 10, у каждого по 1, то пошел дальше и завершил работу.
 

fridayman

Client
Регистрация
25.03.2018
Сообщения
169
Благодарностей
259
Баллы
63
Делюсь наблюдениями.

Метод IGlobalVariables.SetVariable(string, string, dynamic), при инициализации переменной, задает ей: пространство имен, название и даже тип объекта. Это классная новость, ведь теперь я в курсе, что переменная в интерфейсе PM - уже не обязательно string по умолчанию. Можно инициализировать глобальную переменную, указав ей тип List<T> или int, например. В первом случае объект будет обращаться к списку, а во втором - будет вести себя как целочисленная переменная в любых C# экшенах. В общем, это и есть тот самый ответ на вопрос "Как сделать многопоточные списки внутри проекта, не выводя файл наружу?"

По моим наблюдениям, инициализированная таким образом переменная существует в перечне глобальных перменных до того момента, пока не будет закрыт и открыт заново PM. Отсюда возникает вопрос. Она ведь должна храниться, как обычно: либо в стеке, либо в динамической памяти. В общем, не столкнусь ли я с проблемой зависания системы после 100500й созданной таким образом перменной из-за переполнения памяти?

Проект подразумевает создание таких переменных по одной штуке ежеминутно, по задумке они должны быть промаркированы отпечатком timestamp и удалены по истечении 60-секундного интервала.

--
UPD: пожалуй, решу задачу созданием словарей Dictionary<long, List<string>>, тем не менее, вопрос по поводу того, где хранятся глобальные переменные, созданные из-под проекта, актуален
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 694
Баллы
113
Делюсь наблюдениями.

Метод IGlobalVariables.SetVariable(string, string, dynamic), при инициализации переменной, задает ей: пространство имен, название и даже тип объекта. Это классная новость, ведь теперь я в курсе, что переменная в интерфейсе PM - уже не обязательно string по умолчанию. Можно инициализировать глобальную переменную, указав ей тип List<T> или int, например. В первом случае объект будет обращаться к списку, а во втором - будет вести себя как целочисленная переменная в любых C# экшенах. В общем, это и есть тот самый ответ на вопрос "Как сделать многопоточные списки внутри проекта, не выводя файл наружу?"

По моим наблюдениям, инициализированная таким образом переменная существует в перечне глобальных перменных до того момента, пока не будет закрыт и открыт заново PM. Отсюда возникает вопрос. Она ведь должна храниться, как обычно: либо в стеке, либо в динамической памяти. В общем, не столкнусь ли я с проблемой зависания системы после 100500й созданной таким образом перменной из-за переполнения памяти?

Проект подразумевает создание таких переменных по одной штуке ежеминутно, по задумке они должны быть промаркированы отпечатком timestamp и удалены по истечении 60-секундного интервала.

--
UPD: пожалуй, решу задачу созданием словарей Dictionary<long, List<string>>, тем не менее, вопрос по поводу того, где хранятся глобальные переменные, созданные из-под проекта, актуален
ну в динамичной естественно.. кто в стеке размещает долгосрочные объекты ?
 
  • Спасибо
Реакции: fridayman

fridayman

Client
Регистрация
25.03.2018
Сообщения
169
Благодарностей
259
Баллы
63
ну в динамичной естественно.. кто в стеке размещает долгосрочные объекты ?
Хочу все-таки проверить, будет ли сборщик мусора работать так, как надо, если создавать такие временные переменные в большом количестве. По результату отпишусь
 

fridayman

Client
Регистрация
25.03.2018
Сообщения
169
Благодарностей
259
Баллы
63
Хочу все-таки проверить, будет ли сборщик мусора работать так, как надо, если создавать такие временные переменные в большом количестве. По результату отпишусь
Проблем с созданием большого количества временных глобальных переменных не отмечено. Создаются в нужном количестве, удалять не требуется - не захламляют процесс.
 

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