Шаблон - "охраняющий локкер" - или как можно залочить блоки кубиков

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Вам @doc всё верно говорит.
Глобальную переменную нужно удалять из шаблона, иначе при каждом запуске потока она будет переназначаться.

Например, если в процессе работы запустить ещё один поток, когда уже присвоено значение 1, глобальная переменная сбросится до значения по умолчанию - 0. Поэтому данный алгоритм непрактичен.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113

Вложения

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Вам @doc всё верно говорит.
Глобальную переменную нужно удалять из шаблона, иначе при каждом запуске потока она будет переназначаться.

Например, если в процессе работы запустить ещё один поток, когда уже присвоено значение 1, глобальная переменная сбросится до значения по умолчанию - 0. Поэтому данный алгоритм непрактичен.
проверьте шаблон, я выше прикрепил

Вам @doc всё верно говорит.
Глобальную переменную нужно удалять из шаблона, иначе при каждом запуске потока она будет переназначаться.

Например, если в процессе работы запустить ещё один поток, когда уже присвоено значение 1, глобальная переменная сбросится до значения по умолчанию - 0. Поэтому данный алгоритм непрактичен.
да, тестил на двух потоках - не сбрасывает на ноль, когда запустил в 10 потоков - то сбрасывает

хрень полная
 
Последнее редактирование модератором:

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113

doc

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

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
непонятно тогда логика названия - значение по-умолчанию. везде по-умолчанию - это если пользователь не присвоил значение, а оно в одном из потоков присвоено и глобальная переменная существует для всех потоков.
по идее по-умолчанию должно быть так - если в переменной нет значения, то присвоить по-умолчанию, а тут как?
завтра мне опять костыли городить?
 

doc

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

btc22

Client
Регистрация
22.11.2015
Сообщения
9
Благодарностей
8
Баллы
3
Ну так метод SetVariable, он как бы удаляет старый обьект в стеке и создает новый по имени что ввели.
Всё просто. Один раз мы инициализируем переменную при помощи SetVariable, дальше уже берем её из стека памяти зенки каждый раз при помощи var Global = project.GlobalVariables["глобал", "shab_name"]
Придаем значение Global.Value = "Значение";
По крайней мере так ранее работало
 
  • Спасибо
Реакции: arhip1985

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
просто где логика? - в переменной общей для всех потоков есть значение, а его перезаписывает новый поток, поскольку считает, что надо записать значение - по-умолчанию, как будто там его уже нет, хотя там существует уже значение

везде же, если пользователь ничего не передал - то тогда поставить значение по-умолчанию, а тут - там уже есть значение, но оно нам пофиг - надо поставить значение по-умолчанию
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
непонятно тогда логика названия - значение по-умолчанию. везде по-умолчанию - это если пользователь не присвоил значение, а оно в одном из потоков присвоено и глобальная переменная существует для всех потоков.
по идее по-умолчанию должно быть так - если в переменной нет значения, то присвоить по-умолчанию, а тут как?
завтра мне опять костыли городить?
Как уже однажды отвечал @rostonix на эту тему:
хаос в вашем ожидании от работы глобальных переменных.
все работает как нужно)
Прикладываю шаблон работы с глобальными переменными в многопотоке.
 

Вложения

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

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Как уже однажды отвечал @rostonix на эту тему:


Прикладываю шаблон работы с глобальными переменными в многопотоке.
спасибо, Бред, действительно, хаос в моём ожидании и привычном понимании - общего для всех потоков. завтра буду править то, что сегодня сдал) но пока никто не жаловался))
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
спасибо, Бред, действительно, хаос в моём ожидании и привычном понимании - общего для всех потоков. завтра буду править то, что сегодня сдал) но пока никто не жаловался))
проблема в том, что ты думаешь, что сначала переменная получает какие-то значения, а потом уже в игру вступает значение по умолчанию. Но по факту значение по умолчанию первоприоритетная логика и реализуется она ещё до работы с переменной. Если взять локальную переменную, у которой есть значение по умолчанию и которой присваивается значение из входных настроек, то очередь реализаций такая:
1. Переменной присваивается значение по умолчанию
2. Переменной присваивается значение из входных настроек
Нет никаких проверок на пустоту и т.д., просто очередь действий
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
проблема в том, что ты думаешь, что сначала переменная получает какие-то значения, а потом уже в игру вступает значение по умолчанию. Но по факту значение по умолчанию первоприоритетная логика и реализуется она ещё до работы с переменной. Если взять локальную переменную, у которой есть значение по умолчанию и которой присваивается значение из входных настроек, то очередь реализаций такая:
1. Переменной присваивается значение по умолчанию
2. Переменной присваивается значение из входных настроек
Нет никаких проверок на пустоту и т.д., просто очередь действий
а зачем так сделано? в чём преимущество от такого, перед тем как положено?
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
где применимы плюсы от того как это сделано и какие они? в ущерб тому как бы это было выгодно?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
где применимы плюсы от того как это сделано и какие они? в ущерб тому как бы это было выгодно?
скорее всего это просто логика, которая тянется ещё со времён, когда глобалок не было. И без глобалок она была удачной
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
скорее всего это просто логика, которая тянется ещё со времён, когда глобалок не было. И без глобалок она была удачной
откуда она тянется всё равно, не понятно, почему перед вставкой значения по-умолчанию - не проверяется текущее содержимое

в любой из функций, которая принимает значение/я - если они не поступили - то присваивается значение по умолчанию, а если передано - то присваивается то что передано.
Это фича или баг? в чём тогда фича?
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Как уже однажды отвечал @rostonix на эту тему:


Прикладываю шаблон работы с глобальными переменными в многопотоке.
скорее всего это просто логика, которая тянется ещё со времён, когда глобалок не было. И без глобалок она была удачной
Спасибо Вам! с утра вроде всё поправил за 5 минут, обновил стартовый пост. оставил всё так же как было, но убрал значение по-умолчанию визуальное, а вместо него добавил запись во входе в охраняемую зону:
C#:
if(project.GlobalVariables["глобал", "shab_name"].Value==null){
     project.GlobalVariables.SetVariable("глобал", "shab_name", 0);
   }
Получается сделал в коде установку значения по-умолчанию, почему так не сделано в проджект мейкере - для меня загадка и очень хочется узнать где можно применить - то как запись в глобальной переменной в значение по-умолчанию реализована в Проджект Мейкере

хотелось бы узнать от тех - у кого нет хаоса в глове по поводу глобальных переменных, если:
Как уже однажды отвечал @rostonix на эту тему:
rostonix сказал(а):
хаос в вашем ожидании от работы глобальных переменных.
все работает как нужно)
то из-за чего нужно глобальную переменную обновлять со старта значением по-умолчанию, даже если в этой переменной есть уже значение. Если всё работает как нужно - то для чего это нужно? для какого применения это сделано? и чем оно так Важно, если оно вместо логичного применения, которое ростоникс называет хаосом в нашем ожидании
в моём ожидание оно должно работать так как я сделал позже, из-за того, что оказалось что у меня хаос в моём ожидании
 
Последнее редактирование:

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
когда тестил проверку на налл - всё работало, сегодня перестало и надо проверять уже на пустую строку..
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
да, уж, загнался я с этим куском и накричался как сам на себя за своё непонимание, сорри если кому-то надавило на уши.
Короче сравнение с "" - пустой строкой - проходит только в первую итерацию, и если туда попало интовое число, то сравнение рушется, поэтому, надеюсь уже в последний раз выкладываю рабочий вариант входа в охраняемую зону:
C#:
lock(SyncObject)] {
lock(SyncObject) {
   try{
   if(project.GlobalVariables["глобал", "shab_name"].Value==""){
     project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
   }
   }
   catch{
  if(project.GlobalVariables["глобал", "shab_name"].Value!=null&&project.GlobalVariables["глобал", "shab_name"].Value==0){
project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
   return "зашёл 1 поток";
}
else throw new Exception(project.GlobalVariables["глобал", "shab_name"].Value.ToString);

   }
}
}
сорян всем за шум, спасибо, что помогли разобраться, очень нужен иногда данный кусок
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
да, уж, загнался я с этим куском и накричался как сам на себя за своё непонимание, сорри если кому-то надавило на уши.
Короче сравнение с "" - пустой строкой - проходит только в первую итерацию, и если туда попало интовое число, то сравнение рушется, поэтому, надеюсь уже в последний раз выкладываю рабочий вариант входа в охраняемую зону:
C#:
lock(SyncObject)] {
lock(SyncObject) {
   try{
   if(project.GlobalVariables["глобал", "shab_name"].Value==""){
     project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
   }
   }
   catch{
  if(project.GlobalVariables["глобал", "shab_name"].Value!=null&&project.GlobalVariables["глобал", "shab_name"].Value==0){
project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
   return "зашёл 1 поток";
}
else throw new Exception(project.GlobalVariables["глобал", "shab_name"].Value.ToString);

   }
}
}
сорян всем за шум, спасибо, что помогли разобраться, очень нужен иногда данный кусок
C#:
lock(SyncObject)
{
    bool wait = false;
    try
    {
        IGlobalVariable gb = project.GlobalVariables["глобал", "shab_name"];
      
        if (Convert.ToInt32(gb.Value) != 0) wait = true;   
    }
    catch (KeyNotFoundException ex) {}
  
    if (wait) throw new Exception();
    project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
}
 
Последнее редактирование:

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
C#:
lock(SyncObject)
{
    bool wait = false;
    try
    {
        IGlobalVariable gb = project.GlobalVariables["глобал", "shab_name"];
      
        if (Convert.ToInt32(gb.Value) != 0) wait = true;
      
      
    }
    catch (KeyNotFoundException ex) {}
  
    if (wait) throw new Exception();
    project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
}
спасибо док!
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
C#:
lock(SyncObject)
{
    bool wait = false;
    try
    {
        IGlobalVariable gb = project.GlobalVariables["глобал", "shab_name"];
     
        if (Convert.ToInt32(gb.Value) != 0) wait = true;  
    }
    catch (KeyNotFoundException ex) {}
 
    if (wait) throw new Exception();
    project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
}
док, работает отлично, но когда без (KeyNotFoundException ex) , видимо так другое исключение - когда в кэтче именно - (KeyNotFoundException ex) - то кубик всегда по красной выходит, хотя может опять я туплю. ты ж вроде говорил что глобалку не надо вообще создавать, а у меня она создана в проекте - но без значения, и вот если создана - то работает - если пустой кэтч
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
C#:
lock(SyncObject)
{
    bool wait = false;
    try
    {
        IGlobalVariable gb = project.GlobalVariables["глобал", "shab_name"];
     
        if (Convert.ToInt32(gb.Value) != 0) wait = true;  
    }
    catch (KeyNotFoundException ex) {}
 
    if (wait) throw new Exception();
    project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
}
мне кажется я уже вкурил - глобалку ни в коем случае нельзя объявлять в ПМ в таблице - переменные, иначе она каждый раз будет сбрасывать все текущие значения, даже если не стоит по-умолчанию какое либо значение) Спасибо Док ещё раз.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
мне кажется я уже вкурил - глобалку ни в коем случае нельзя объявлять в ПМ в таблице - переменные, иначе она каждый раз будет сбрасывать все текущие значения, даже если не стоит по-умолчанию какое либо значение) Спасибо Док ещё раз.
Так и есть
 
  • Спасибо
Реакции: arhip1985

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
а для чего есть такая возможность?)

хотя для отладки - отслеживать - что там лежит
Скорее она просто подтянулась, если за осно брался готовый функционал локальных переменных
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Скорее она просто подтянулась, если за осно брался готовый функционал локальных переменных
просто в зенно почти всё так просто и интуитивно понятно, что и с глобалками казалось, что всё должно быть интуитивно
никогда до этого их не использовал - а ведь с ними открываются гораздо бОльшие возможности в многопотоке и гибкость, - те же локи, общение между потоками - если требуется и тд
 

doc

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

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
ну вот например - для общения между потоками разных шаблонов - глобалка подойдёт или уже тут не катит?

хотя для другого потока её наверно не залочить...
 

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
83
Баллы
28
общение между потоками
Ну большинство для этих целей юзает файлы. У глобалок есть минус - при перезапуска исчезают. Хотя для некоторых целей это плюс
Значит надо использовать file?
Чтобы только один поток собирал ссылки со страниц, я собрался первым потоком создать файлик с номером последней страницы. Остальные потоки проверят его содержимое и сразу пойдут парсить объявления.
Правильно?

Вот у меня парсер легко определяет последнюю страницу.
Locker тогда без кода в три кубика получается ))

1) поток пытается прочитать файл {-Project.Directory-}\.txt
2) если равно количеству страниц, поток уходит парсить объявления
3) если не прочиталось или если не равно, поток записывает в файл количество страниц и уходит парсить страницу за страницей
Усё.
 
Последнее редактирование:

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