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

Artur159

Client
Регистрация
10.03.2020
Сообщения
52
Реакции
4
Баллы
8
Всех приветствую! Суть проблемы такая - шаб робит в 200 потоков и кладет данные в таблицу, мне нужно, чтобы в начале работы, когда создается сам файл таблицы создать заголовок столбцов, к примеру пусть будет NAME LOGIN PASSWORD BIRTHDAY. Нужно, чтобы один 1 поток только создал заголовок, а остальные 199 прошли мимо. Будет круто, если решение на c#, на ум только приходит создавать заголовок с помощью промежуточного, как шаба запустился, один из потоков создал промежуточный файл, а другие потоки видят этот файл и не будут тоже создавать заголовки колонок, но меня не особо устраивает такой вариант.
 
Всех приветствую! Суть проблемы такая - шаб робит в 200 потоков и кладет данные в таблицу, мне нужно, чтобы в начале работы, когда создается сам файл таблицы создать заголовок столбцов, к примеру пусть будет NAME LOGIN PASSWORD BIRTHDAY. Нужно, чтобы один 1 поток только создал заголовок, а остальные 199 прошли мимо. Будет круто, если решение на c#, на ум только приходит создавать заголовок с помощью промежуточного, как шаба запустился, один из потоков создал промежуточный файл, а другие потоки видят этот файл и не будут тоже создавать заголовки колонок, но меня не особо устраивает такой вариант.
На c# делаете lock к таблице, проверяете есть ли файл таблицы, если есть, тогда проверка на первую строку, если она пустая - делаем запись шапки, если не пустая, идем сразу записывать данные.
 
  • Спасибо
Реакции: Artur159
А вы не могли бы код этот написать? А то у меня прям беда беда с синтаксисом)
 
Решение через глобальную переменную.
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
Решение через глобальную переменную.
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);

    }
}
Смотри как я думаю, поток зашел, он по любому пропишет заголовок, а другие потоки пойдут по ошибке, но тут момент старта, файл не успеет обновиться, а другие потоки пойдут. Значит, код отработал по ошибки, и сразу сделать, проверку переменной на пустоту
Да, тоже сначала пробовал через глобальные сделать, но потом плюнул на эту затею) Спасибо за решение, сейчас опробирую)
 
Всех приветствую! Суть проблемы такая - шаб робит в 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
если файл таблицы присутствует, то локирование/глобльные переменные - будут излишними,
поскольку заголовки статичны, не важно какой поток впишет эти самые заголовки (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

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