Глобальная переменная цикл + таблица C#

  • Автор темы Автор темы lbvf65
  • Дата начала Дата начала

lbvf65

Client
Регистрация
20.08.2020
Сообщения
468
Реакции
140
Баллы
43
Глобальная переменная:
Развернуть Свернуть Копировать
lock(SyncObject) {

    try {
        //Если глобалка инициализирована - апаем на 1, возвращаем в переменну.
        var gb_count = project.GlobalVariables[project.ExecuteMacro(project.Name), project.ExecuteMacro(project.Name)];
        gb_count.Value = Convert.ToInt32(gb_count.Value.ToString())+1;

    
    }
    catch (KeyNotFoundException ex) {
        //Если нет - инииализируем со значением 0, возвращаем ноль
        project.GlobalVariables.SetVariable(project.ExecuteMacro(project.Name), project.ExecuteMacro(project.Name), 0);

    }



}




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

Выполнение действия TextProcessing Глобальная переменная Hotline.zp.Hotline.zp не инициализирована

Hotline.zp.Hotline.zp Я подозреваю это Баг и связанный он с точками



C#:
Развернуть Свернуть Копировать
var sourceTable = project.Tables["Фид исходный хотлайн"];

project.Variables["ID"].Value = sourceTable.GetCell(i,0);

project.Variables["category_name"].Value = sourceTable.GetCell(i,1);


помогите пожалуйста реализовать эту логику

в момент обновление счетчика бралось значение из ячеек excel без удаления
 
SyncObject

этим объектом для лока советую не пользоваться
Подскажите пожалуйста как правильно реализовать

чтобы увеличивалось значение глобальной переменной +1 и брались нужные ячейки из экселе
чтобы 2 потока не могли прочитать одни и те же ячейки экселя
и какие нужно правильно использовать локи

заранее благодарю если по можете
 
Подскажите пожалуйста как правильно реализовать

чтобы увеличивалось значение глобальной переменной +1 и брались нужные ячейки из экселе
чтобы 2 потока не могли прочитать одни и те же ячейки экселя
и какие нужно правильно использовать локи

заранее благодарю если по можете
я же тебе скинул ссылку на гитхаб. там как раз лок через глобалку. код полностью рабочий. бери и пользуйся копипастом.
вот чуть подробнее https://zennolab.com/discussion/threads/konstrukcija-lock-syncobjects-listsyncer.103375/post-685404
 
  • Спасибо
Реакции: lbvf65
подскажи пожалуйста почему не работает

C#:
Развернуть Свернуть Копировать
// Создание объектов синхронизации в глобальной переменной для изменения списков,
// таблиц, других глобальных переменных и т.д. в разных шаблонах

// неймспейс и имя новой переменой для синхронизации
string namespaceName = "test_namespace";
string globVarName = "my_sync_object";

// Выполняется в начале проекта
lock (project.GlobalVariables)
{
    // проверка на существование глобальной переменной
    try {
        // попытка получения объекта (переход на catch при неудаче)
        var syncobj = project.GlobalVariables[namespaceName, globVarName];
        
    } catch (KeyNotFoundException ex) {
        // создание объекта синхронизации и его установка, объект может быть любым, но не должен меняться!
        object syncobj = new Object();
        project.GlobalVariables.SetVariable(namespaceName, globVarName, syncobj);
    }
}


var syncObject = project.GlobalVariables["test_namespace","my_sync_object"].Value;
lock (syncObject)
 {
    
    try {
        //Если глобалка инициализирована - апаем на 1, возвращаем в переменну.
        var gb_count = project.GlobalVariables["namespace", "global_count"];
        gb_count.Value = Convert.ToInt32(gb_count.Value.ToString())+1;

        
    }
    catch (KeyNotFoundException ex) {
        //Если нет - инииализируем со значением 0, возвращаем ноль
        project.GlobalVariables.SetVariable("namespace", "global_count", 0);
        
    }
    

// Текст для обработки
string i = project.ExecuteMacro(project.GlobalVariables["namespace", "global_count"].Value);

var sourceTable = project.Tables["Фид исходный хотлайн"];

project.Variables["ID"].Value = sourceTable.GetCell(i,0);

project.Variables["category_name"].Value = sourceTable.GetCell(i,1);
    

    
    
}
 
Последнее редактирование:
извини меня конечно пожалуйста

Посмотреть вложение 105762

я не могу понять как получить счетчик

i++

var sourceTable = project.Tables["Фид исходный хотлайн"];

project.Variables["ID"].Value = sourceTable.GetCell(i,0);

project.Variables["category_name"].Value = sourceTable.GetCell(i,1);

C#:
Развернуть Свернуть Копировать
// Создание объектов синхронизации в глобальной переменной для изменения списков,
// таблиц, других глобальных переменных и т.д. в разных шаблонах

// неймспейс и имя новой переменой для синхронизации
string namespaceName = "test_namespace";
string globVarName = "my_sync_object";

// Выполняется в начале проекта
lock (project.GlobalVariables)
{
    // проверка на существование глобальной переменной
    try {
        // попытка получения объекта (переход на catch при неудаче)
        var syncobj = project.GlobalVariables[namespaceName, globVarName];
        return syncobj.ToString(); // возврат его значения (отобразится в логе PM, если возможно)
    } catch (KeyNotFoundException ex) {
        // создание объекта синхронизации и его установка, объект может быть любым, но не должен меняться!
        object syncobj = new Object();
        project.GlobalVariables.SetVariable(namespaceName, globVarName, syncobj);
    }
}


var syncObject = project.GlobalVariables["test_namespace","my_sync_object"].Value;
lock (syncObject)
{

   
    try {
        //Если глобалка инициализирована - апаем на 1, возвращаем в переменну.
        var gb_count = project.GlobalVariables["namespace", "global_count"];
        gb_count.Value = Convert.ToInt32(gb_count.Value.ToString())+1;
        return gb_count.Value;
       
    }
    catch (KeyNotFoundException ex) {
        //Если нет - инииализируем со значением 0, возвращаем ноль
        project.GlobalVariables.SetVariable("namespace", "global_count", 0);
        return 0;
    }
   
}
этот код возвращает сам счетчик в переменную
 
  • Спасибо
Реакции: lbvf65

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