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

lbvf65

Client
Регистрация
20.08.2020
Сообщения
439
Благодарностей
114
Баллы
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 без удаления
 

Phoenix78

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

doc

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

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

lbvf65

Client
Регистрация
20.08.2020
Сообщения
439
Благодарностей
114
Баллы
43
SyncObject

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

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

заранее благодарю если по можете
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
Подскажите пожалуйста как правильно реализовать

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

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

lbvf65

Client
Регистрация
20.08.2020
Сообщения
439
Благодарностей
114
Баллы
43
подскажи пожалуйста почему не работает

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);
    

    
    
}
 
Последнее редактирование:

doc

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

Посмотреть вложение 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

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