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

Artur159

Client
Регистрация
10.03.2020
Сообщения
46
Благодарностей
4
Баллы
8
Всех приветствую! Суть проблемы такая - шаб робит в 200 потоков и кладет данные в таблицу, мне нужно, чтобы в начале работы, когда создается сам файл таблицы создать заголовок столбцов, к примеру пусть будет NAME LOGIN PASSWORD BIRTHDAY. Нужно, чтобы один 1 поток только создал заголовок, а остальные 199 прошли мимо. Будет круто, если решение на c#, на ум только приходит создавать заголовок с помощью промежуточного, как шаба запустился, один из потоков создал промежуточный файл, а другие потоки видят этот файл и не будут тоже создавать заголовки колонок, но меня не особо устраивает такой вариант.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 444
Благодарностей
1 287
Баллы
113
Всех приветствую! Суть проблемы такая - шаб робит в 200 потоков и кладет данные в таблицу, мне нужно, чтобы в начале работы, когда создается сам файл таблицы создать заголовок столбцов, к примеру пусть будет NAME LOGIN PASSWORD BIRTHDAY. Нужно, чтобы один 1 поток только создал заголовок, а остальные 199 прошли мимо. Будет круто, если решение на c#, на ум только приходит создавать заголовок с помощью промежуточного, как шаба запустился, один из потоков создал промежуточный файл, а другие потоки видят этот файл и не будут тоже создавать заголовки колонок, но меня не особо устраивает такой вариант.
На c# делаете lock к таблице, проверяете есть ли файл таблицы, если есть, тогда проверка на первую строку, если она пустая - делаем запись шапки, если не пустая, идем сразу записывать данные.
 
  • Спасибо
Реакции: Artur159

Artur159

Client
Регистрация
10.03.2020
Сообщения
46
Благодарностей
4
Баллы
8
А вы не могли бы код этот написать? А то у меня прям беда беда с синтаксисом)
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
742
Баллы
113
Решение через глобальную переменную.
C#:
lock(SyncObject) {
    try {
    
        var gb_count = project.GlobalVariables["глобал", "shab_name"];
        if(Convert.ToInt32(gb_count.Value) > 0)
        {
            //иди по красной
            throw new Exception();
        }   
          
        return ++gb_count.Value;
    }
    catch (KeyNotFoundException ex) {
        project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
        return 1;
        // Установленная пауза
System.Threading.Thread.Sleep(8 * 1000);

    }
}
Смотри как я думаю, поток зашел, он по любому пропишет заголовок, а другие потоки пойдут по ошибке, но тут момент старта, файл не успеет обновиться, а другие потоки пойдут. Значит, код отработал по ошибки, и сразу сделать, проверку переменной на пустоту
 
  • Спасибо
Реакции: Artur159

Artur159

Client
Регистрация
10.03.2020
Сообщения
46
Благодарностей
4
Баллы
8
Решение через глобальную переменную.
C#:
lock(SyncObject) {
    try {
   
        var gb_count = project.GlobalVariables["глобал", "shab_name"];
        if(Convert.ToInt32(gb_count.Value) > 0)
        {
            //иди по красной
            throw new Exception();
        }  
         
        return ++gb_count.Value;
    }
    catch (KeyNotFoundException ex) {
        project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
        return 1;
        // Установленная пауза
System.Threading.Thread.Sleep(8 * 1000);

    }
}
Смотри как я думаю, поток зашел, он по любому пропишет заголовок, а другие потоки пойдут по ошибке, но тут момент старта, файл не успеет обновиться, а другие потоки пойдут. Значит, код отработал по ошибки, и сразу сделать, проверку переменной на пустоту
Да, тоже сначала пробовал через глобальные сделать, но потом плюнул на эту затею) Спасибо за решение, сейчас опробирую)
 

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
543
Баллы
93
Всех приветствую! Суть проблемы такая - шаб робит в 200 потоков и кладет данные в таблицу, мне нужно, чтобы в начале работы, когда создается сам файл таблицы создать заголовок столбцов, к примеру пусть будет NAME LOGIN PASSWORD BIRTHDAY. Нужно, чтобы один 1 поток только создал заголовок, а остальные 199 прошли мимо. Будет круто, если решение на c#, на ум только приходит создавать заголовок с помощью промежуточного, как шаба запустился, один из потоков создал промежуточный файл, а другие потоки видят этот файл и не будут тоже создавать заголовки колонок, но меня не особо устраивает такой вариант.
если файл таблицы присутствует, то локирование/глобльные переменные - будут излишними,
поскольку заголовки статичны, не важно какой поток впишет эти самые заголовки (1ый или 200ый)
важно локировать только все последующие действия с таблицей в многопотоке

C#:
var table = project.Tables["Таблица 1"];
var headings = new List<string>{"NAME", "LOGIN", "PASSWORD", "BIRTHDAY"};   

if (string.IsNullOrEmpty(string.Join("", table.GetColumnsNames()))) {
    for (int i = 0; i < headings.Count; i++) {
        table.SetCell(i, 0, headings[i]);
    }
}
 
  • Спасибо
Реакции: Serpentarius и Artur159

Artur159

Client
Регистрация
10.03.2020
Сообщения
46
Благодарностей
4
Баллы
8
если файл таблицы присутствует, то локирование/глобльные переменные - будут излишними,
поскольку заголовки статичны, не важно какой поток впишет эти самые заголовки (1ый или 200ый)
важно локировать только все последующие действия с таблицей в многопотоке

C#:
var table = project.Tables["Таблица 1"];
var headings = new List<string>{"NAME", "LOGIN", "PASSWORD", "BIRTHDAY"};  

if (string.IsNullOrEmpty(string.Join("", table.GetColumnsNames()))) {
    for (int i = 0; i < headings.Count; i++) {
        table.SetCell(i, 0, headings[i]);
    }
}
Спасибо огромное за сниппет, поставил его в свой проект, сработал как и нужно, с меня жирный ЛАЙКОС)
 
  • Спасибо
Реакции: Ilshakin

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