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

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

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

Вложения

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

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

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

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

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

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

Прикладываю шаблон работы с глобальными переменными в многопотоке.
x0vAQav.png
 

Вложения

  • Спасибо
Реакции: arhip1985
Как уже однажды отвечал @rostonix на эту тему:


Прикладываю шаблон работы с глобальными переменными в многопотоке.
x0vAQav.png
спасибо, Бред, действительно, хаос в моём ожидании и привычном понимании - общего для всех потоков. завтра буду править то, что сегодня сдал) но пока никто не жаловался))
 
спасибо, Бред, действительно, хаос в моём ожидании и привычном понимании - общего для всех потоков. завтра буду править то, что сегодня сдал) но пока никто не жаловался))
проблема в том, что ты думаешь, что сначала переменная получает какие-то значения, а потом уже в игру вступает значение по умолчанию. Но по факту значение по умолчанию первоприоритетная логика и реализуется она ещё до работы с переменной. Если взять локальную переменную, у которой есть значение по умолчанию и которой присваивается значение из входных настроек, то очередь реализаций такая:
1. Переменной присваивается значение по умолчанию
2. Переменной присваивается значение из входных настроек
Нет никаких проверок на пустоту и т.д., просто очередь действий
 
проблема в том, что ты думаешь, что сначала переменная получает какие-то значения, а потом уже в игру вступает значение по умолчанию. Но по факту значение по умолчанию первоприоритетная логика и реализуется она ещё до работы с переменной. Если взять локальную переменную, у которой есть значение по умолчанию и которой присваивается значение из входных настроек, то очередь реализаций такая:
1. Переменной присваивается значение по умолчанию
2. Переменной присваивается значение из входных настроек
Нет никаких проверок на пустоту и т.д., просто очередь действий
а зачем так сделано? в чём преимущество от такого, перед тем как положено?
 
где применимы плюсы от того как это сделано и какие они? в ущерб тому как бы это было выгодно?
 
где применимы плюсы от того как это сделано и какие они? в ущерб тому как бы это было выгодно?
скорее всего это просто логика, которая тянется ещё со времён, когда глобалок не было. И без глобалок она была удачной
 
скорее всего это просто логика, которая тянется ещё со времён, когда глобалок не было. И без глобалок она была удачной
откуда она тянется всё равно, не понятно, почему перед вставкой значения по-умолчанию - не проверяется текущее содержимое

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


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

Получается сделал в коде установку значения по-умолчанию, почему так не сделано в проджект мейкере - для меня загадка и очень хочется узнать где можно применить - то как запись в глобальной переменной в значение по-умолчанию реализована в Проджект Мейкере

хотелось бы узнать от тех - у кого нет хаоса в глове по поводу глобальных переменных, если:
Как уже однажды отвечал @rostonix на эту тему:
rostonix сказал(а):
хаос в вашем ожидании от работы глобальных переменных.
все работает как нужно)
то из-за чего нужно глобальную переменную обновлять со старта значением по-умолчанию, даже если в этой переменной есть уже значение. Если всё работает как нужно - то для чего это нужно? для какого применения это сделано? и чем оно так Важно, если оно вместо логичного применения, которое ростоникс называет хаосом в нашем ожидании
в моём ожидание оно должно работать так как я сделал позже, из-за того, что оказалось что у меня хаос в моём ожидании
 
Последнее редактирование:
когда тестил проверку на налл - всё работало, сегодня перестало и надо проверять уже на пустую строку..
 
да, уж, загнался я с этим куском и накричался как сам на себя за своё непонимание, сорри если кому-то надавило на уши.
Короче сравнение с "" - пустой строкой - проходит только в первую итерацию, и если туда попало интовое число, то сравнение рушется, поэтому, надеюсь уже в последний раз выкладываю рабочий вариант входа в охраняемую зону:
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)] {
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);
}
 
Последнее редактирование:
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);
}
спасибо док!
 
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) - то кубик всегда по красной выходит, хотя может опять я туплю. ты ж вроде говорил что глобалку не надо вообще создавать, а у меня она создана в проекте - но без значения, и вот если создана - то работает - если пустой кэтч
 
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
а для чего есть такая возможность?)

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

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

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

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

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