Помогите не знаю как реализовать такое на С#

lbvf65

Client
Регистрация
20.08.2020
Сообщения
439
Благодарностей
114
Баллы
43
Чтобы поставить С# первым кубиком и он отработал лиж при перезапуске шаблона 1 раз (в первом инстансе)
и
Чтобы поставить С# последним кубиком и он отработал 1 раз (в последнем инстансе)

Пожалуйста помогите знающие люди

Надо для проекта и не могу реализовать

Заранее спасибо за любую помощь
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
ну первый не сложно. в локе просто идет доступ к глобалке и если там нет кодового слова - прописать его и этот поток будет первым и будет выполнять нужную штуку. Остальные потоки будут находить в глобалке кодовое слово и сливаться.
Тоже самое и с завершением, только наоборот. Главный вопрос в том, как определять, что инстанс последний? Ну и еще куча мелких нюансов, которые тоже придётся продумывать
 
  • Спасибо
Реакции: lbvf65

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 454
Баллы
113
Чтобы поставить С# первым кубиком и он отработал лиж при перезапуске шаблона 1 раз (в первом инстансе)
и
Чтобы поставить С# последним кубиком и он отработал 1 раз (в последнем инстансе)

Пожалуйста помогите знающие люди

Надо для проекта и не могу реализовать

Заранее спасибо за любую помощь
Создаем список.
Каждый инстанс получает количество строк в списке.
Если в списке 0 строк - значит это первый инстанс - добавил строчку в список.
Во входящих настройках ставим максимальное количество инстансов.
Каждый поток сверяет количество строчек в списке с этим значением - если значение равно - значит это последний инстанс.

И да при завершении любого инстанса - он должен удалить строчку со значением, которое добавил в список.
Таким образом при завершении всех - список будет пустым.

На вариант...
 
  • Спасибо
Реакции: lbvf65

lbvf65

Client
Регистрация
20.08.2020
Сообщения
439
Благодарностей
114
Баллы
43
Создаем список.
Каждый инстанс получает количество строк в списке.
Если в списке 0 строк - значит это первый инстанс - добавил строчку в список.
Во входящих настройках ставим максимальное количество инстансов.
Каждый поток сверяет количество строчек в списке с этим значением - если значение равно - значит это последний инстанс.

И да при завершении любого инстанса - он должен удалить строчку со значением, которое добавил в список.
Таким образом при завершении всех - список будет пустым.

На вариант...
Спасибо
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
C#:
lock(SyncObject) {
  try {
  var gb_count = project.GlobalVariables["threads", "variable_name"];
  return ++gb_count.Value;
  }
  catch (KeyNotFoundException ex) {
  project.GlobalVariables.SetVariable("threads", "variable_name", 1);
  return 1;
  }
}


lock(SyncObject){
    project.GlobalVariables.SetVariable("threads", "variable_name", 0);
}
Это если несколько потов, например, у меня есть парсер, парсит много сайтов, я так на каждый сайт по 5 потов выделяю.
Вот реализация Владимера https://zennolab.com/discussion/threads/shablon-oxranjajuschij-lokker-ili-kak-mozhno-zalochit-bloki-kubikov.51566/
Как раз для одного потока

C#:
lock(SyncObject) {
project.GlobalVariables.SetVariable("глобал", "shab_name", 0);
return "можно заходить другим";
}

lock(SyncObject)] {
  if(project.GlobalVariables["глобал", "shab_name"].Value==0){
project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
    return "зашёл 1 поток";
}
    else throw new Exception();

}
Я делаю так, в уведомление переменную прописываю {-GlobalVariable.глобал.shab_name-} если получаю ошибку, делаю вход и создается переменная,
1627408551869.png
 
  • Спасибо
Реакции: lbvf65

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
C#:
lock(SyncObject) {
  try {
  var gb_count = project.GlobalVariables["threads", "variable_name"];
  return ++gb_count.Value;
  }
  catch (KeyNotFoundException ex) {
  project.GlobalVariables.SetVariable("threads", "variable_name", 1);
  return 1;
  }
}


lock(SyncObject){
    project.GlobalVariables.SetVariable("threads", "variable_name", 0);
}
Это если несколько потов, например, у меня есть парсер, парсит много сайтов, я так на каждый сайт по 5 потов выделяю.
Вот реализация Владимера https://zennolab.com/discussion/threads/shablon-oxranjajuschij-lokker-ili-kak-mozhno-zalochit-bloki-kubikov.51566/
Как раз для одного потока

C#:
lock(SyncObject) {
project.GlobalVariables.SetVariable("глобал", "shab_name", 0);
return "можно заходить другим";
}

lock(SyncObject)] {
  if(project.GlobalVariables["глобал", "shab_name"].Value==0){
project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
    return "зашёл 1 поток";
}
    else throw new Exception();

}
Я делаю так, в уведомление переменную прописываю {-GlobalVariable.глобал.shab_name-} если получаю ошибку, делаю вход и создается переменная,
Посмотреть вложение 80594
работайте с SyncObject осторожно. В каждом новом участке кода (или в сниппете) он новый, и блокировка не одна и та же
 
  • Спасибо
Реакции: BAZAg и Roman48

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
работайте с SyncObject осторожно. В каждом новом участке кода (или в сниппете) он новый, и блокировка не одна и та же
Подскажешь, пожалуйста, как в код добавить сравнение if ?
C#:
lock(SyncObject) {
  try {
  var gb_count = project.GlobalVariables["threads", "variable_name"];
  return ++gb_count.Value;
  }
  catch (KeyNotFoundException ex) {
  project.GlobalVariables.SetVariable("threads", "variable_name", 1);
  return 1;
  }
}
C#:
if(project.GlobalVariables["глобал", "shab_name"].Value<=5)
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Подскажешь, пожалуйста, как в код добавить сравнение if ?
C#:
lock(SyncObject) {
  try {
  var gb_count = project.GlobalVariables["threads", "variable_name"];
  return ++gb_count.Value;
  }
  catch (KeyNotFoundException ex) {
  project.GlobalVariables.SetVariable("threads", "variable_name", 1);
  return 1;
  }
}
C#:
if(project.GlobalVariables["глобал", "shab_name"].Value<=5)
зависит от того, что ты хочешь
 
  • Спасибо
Реакции: lbvf65

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
зависит от того, что ты хочешь
Поток заходит, + 1 в переменой, но перед заходом сравнение например поставил 5 потоков, 6 поток уже не зайдет, а пойдет в другое место. Сейчас я это делаю кубиком if перед сниппетом.
 
  • Спасибо
Реакции: lbvf65

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Поток заходит, + 1 в переменой, но перед заходом сравнение например поставил 5 потоков, 6 поток уже не зайдет, а пойдет в другое место. Сейчас я это делаю кубиком if перед сниппетом.
всё равно задача туманная. Здесь надо всё четко понимать мне, ибо блокировки надо четко расставить. Давай больше инфы и подробнее
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
После захода, назовем его лок кубиков, вот после захода в лок кубика поток там работает по кругу, берет ссылки из файла с удалением и парсит. Я выделяю на каждый сайт по 5 потоков. В эту {-GlobalVariable.глобал.shab_name-} переменную записывается сколько потоков зашло, как поток заходит, в глобальной переменой {-GlobalVariable.глобал.shab_name-} цифра увеличивается на один.
Сейчас может зайти хоть 100 поток. Нужно перед заходом, сразу после lock(SyncObject) { сделать условие if(project.GlobalVariables["глобал", "shab_name"].Value<=5) если в переменой {-GlobalVariable.глобал.shab_name-} цифра 5 поток уже кубик не пройдет, уйдет по ошибке, цель не допустить парсинга больше 5 поток на один сайт.

C#:
lock(SyncObject) {
  try {
  var gb_count = project.GlobalVariables["глобал", "shab_name"];
  return ++gb_count.Value;
  }
  catch (KeyNotFoundException ex) {
  project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
  return 1;
  }
}

if(project.GlobalVariables["глобал", "shab_name"].Value<=5)

Сейчас у меня такая конструкция
80634
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Последнее редактирование:
  • Спасибо
Реакции: Roman48

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
C#:
if(Convert.ToInt32(project.GlobalVariables["глобал", "shab_name"].Value)>5)
{
    //иди по красной
    return null;
}
Работает спасибо. Код тут оставлю, может кому то пригодиться.
C#:
lock(SyncObject) {
if(Convert.ToInt32(project.GlobalVariables["глобал", "shab_name"].Value)>5)
{
    //иди по красной
    return null;
}   
  try {
  var gb_count = project.GlobalVariables["глобал", "shab_name"];
  return ++gb_count.Value;
  }
  catch (KeyNotFoundException ex) {
  project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
  return 1;
  }
}
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
Подскажешь как тут сделать условие, поток один заходит, и на выходе в переменную пишет время, а другой поток может зайти если только пройдет время 10 минут?
Спасибо не первый раз ты мне помогаешь.
C#:
lock(SyncObject) {
  if(project.GlobalVariables["глобал", "shab_name"].Value=="2021 17:53:29"){
project.GlobalVariables.SetVariable("глобал", "shab_name", "2021 17:53:29");
    return "зашёл 1 поток";
}
    else throw new Exception();

}
Так вроде работает, но нужно с разницей 10 минут
80636
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Работает спасибо. Код тут оставлю, может кому то пригодиться.
C#:
lock(SyncObject) {
if(Convert.ToInt32(project.GlobalVariables["глобал", "shab_name"].Value)>5)
{
    //иди по красной
    return null;
}  
  try {
  var gb_count = project.GlobalVariables["глобал", "shab_name"];
  return ++gb_count.Value;
  }
  catch (KeyNotFoundException ex) {
  project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
  return 1;
  }
}
в твоём варианте после перезапуска зенно всегда будет по красной уходить
пробуй этот вариант
C#:
lock(SyncObject) { 
    try {
        var gb_count = project.GlobalVariables["глобал", "shab_name"];
        if(Convert.ToInt32(gb_count.Value) > 5)
        {
            //иди по красной
            throw new Exception();
        }   
          
        return ++gb_count.Value;
    }
    catch (KeyNotFoundException ex) {
        project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
        return 1;
    }
}
 
  • Спасибо
Реакции: Roman48

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Так вроде работает, но нужно с разницей 10 минут
формат даты только надо вида: 28.07.2021 20:16:08
C#:
lock(SyncObject) {
    DateTime time;
    try{
        time = Convert.ToDateTime(project.GlobalVariables["глобал", "shab_name"].Value);
    }
    catch{
        project.SendErrorToLog("Нужно исправить формат даты в переменной shab_name", true);
        return null;
    }
    
    //если текущее время больше чем время в глобальной переменной shab_name + 10 мин
    if(DateTime.Now > time.AddMinutes(10))
    {
        //запись текущего времени и выход по зеленой
        project.GlobalVariables.SetVariable("глобал", "shab_name", DateTime.Now.ToString());
        return "зашёл 1 поток";
    }
    else
    {
        //выход по красной
        throw new Exception("идем по красной");
    }
}
 
  • Спасибо
Реакции: Roman48

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
работайте с SyncObject осторожно. В каждом новом участке кода (или в сниппете) он новый, и блокировка не одна и та же
Теперь дошло)
C#:
lock (project.GlobalVariables)
{
Получается что можно и на код C# делать лок
C#:
lock (project.Variables)
Сейчас проверил, код отрабатывает
1628022640955.png
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Теперь дошло)
C#:
lock (project.GlobalVariables)
{
Получается что можно и на код C# делать лок
C#:
lock (project.Variables)
Сейчас проверил, код отрабатывает
Посмотреть вложение 80917
что работает то ?
что этот код лочит ? локальную переменную в 1 потоке , когда они и так там приватная ? Какой в этом глубокий смысл ?
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113

doc

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

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113

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