Многопоток)

Andi88

Client
Регистрация
17.10.2015
Сообщения
228
Благодарностей
26
Баллы
28
Ребята, есть папка txt файлов с данными,для работы с ними создаётся список, (названия\путь) список txt и из него строки берутся с удалением, как сделать, чтобы когда файлы в списке закончились(или их там не было в начале) следующий поток создавал список заново? Тоесть я запускаю потоки и 1 из них должен создать список для работы других и своей, такое можно сделать? (получается все потоки должны подождать пока 1 создаст список) Сейчас составляю список отдельным проектом(но это не очень удобно).
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
По логике следует после того как один из потоков обнаружит, что список пуст, создать флаг (пустой файл), сообщающий остальным потокам, что список пополняется (чтобы избежать коллизий) и запустить пополнение списка, например через проект в проекте.
По завершению вложенный проект снимает/удаляет флаг и работа продолжается.
 

Andi88

Client
Регистрация
17.10.2015
Сообщения
228
Благодарностей
26
Баллы
28
По логике следует после того как один из потоков обнаружит, что список пуст, создать флаг (пустой файл), сообщающий остальным потокам, что список пополняется (чтобы избежать коллизий) и запустить пополнение списка, например через проект в проекте.
По завершению вложенный проект снимает/удаляет флаг и работа продолжается.
По логике да, а по логике многопотока? Ведь все проекты стартуют одновременно. Тоесть если один обнаружит в этот момент это может обнаружить и другой))(пробовал так делать с помощью глобальной переменной(флаг).С самого начала делал проверку глобальной переменной, если пустая(запуск первый раз) то создаётся список (и ставится значение 1), если 1 то берётся строка (делал под 1 круг), но почему то не получилось, проскакивали одновременно.
 

Andi88

Client
Регистрация
17.10.2015
Сообщения
228
Благодарностей
26
Баллы
28
Так пытался решить вопрос, если работет, то только через раз (и один раз, потом надо менять цифру переменной и условия)
 

Вложения

  • 23,8 КБ Просмотры: 178

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
По логике да, а по логике многопотока?
Никакой другой логики не существует. В многопотоке есть особенности, но логика всё та же.
Ведь все проекты стартуют одновременно.
Ну, и что?
Тоесть если один обнаружит в этот момент это может обнаружить и другой))(пробовал так делать с помощью глобальной переменной(флаг). С самого начала делал проверку глобальной переменной, если пустая(запуск первый раз) то создаётся список (и ставится значение 1), если 1 то берётся строка (делал под 1 круг), но почему то не получилось, проскакивали одновременно.
На счёт глюков с глобальными переменными довольно часто пишут люди на форуме. Я предпочитаю файлы.
 

doc

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

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Как другие потоки будут узнавать о том, что список уже обрабатывается, чтобы они в свою очередь не запускали пополнение списка?
Отдельный шаблон с вечным циклом для пополнения списка предлагаете запускать?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Как другие потоки будут узнавать о том, что список уже обрабатывается, чтобы они в свою очередь не запускали пополнение списка?
Отдельный шаблон с вечным циклом для пополнения списка предлагаете запускать?
а как потоки расценивают такую конструкцию?
lock(SyncObject)
{
код
}
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113

doc

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

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
зачем вообще софтом каким-то пользоваться? ведь есть шарп
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
На счёт глюков с глобальными переменными довольно часто пишут люди на форуме. Я предпочитаю файлы.
Не припомню ни одного сообщения пользователя про глобальные, в котором был бы доказан глюк с ними за последний год)
Все там работает замечательно. Сам пользуюсь.
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Не припомню ни одного сообщения пользователя про глобальные, в котором был бы доказан глюк с ними за последний год)
Все там работает замечательно. Сам пользуюсь.
Я с того времени и не пользовался.

К тому же у @Andi88 не получилось:
С самого начала делал проверку глобальной переменной, если пустая(запуск первый раз) то создаётся список (и ставится значение 1), если 1 то берётся строка (делал под 1 круг), но почему то не получилось, проскакивали одновременно.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113

Andi88

Client
Регистрация
17.10.2015
Сообщения
228
Благодарностей
26
Баллы
28
Как это сделать в моём примере? (залочить)
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Смотрите мой пример
 

Andi88

Client
Регистрация
17.10.2015
Сообщения
228
Благодарностей
26
Баллы
28
Почему не лочится? Нужно чтобы если нет переменной, то создавалась, ставилось 1 и выходила по красной, если есть то проверяло- если 1 то зелёная, если 0 ставилось 1 и красная стрелка, сейчас получается что они всё рано успевают заползать (даже иногда по 3) через красную вначале.
Код:
lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["[email protected]", "globVar1"];
            var gbVarr = Convert.ToInt32(project.GlobalVariables["[email protected]", "globVar1"].Value);
if (gbVarr == 0)
{int defaultValue = 1;
    project.GlobalVariables.SetVariable("[email protected]", "globVar1", defaultValue);
    return null;}
            return gbVarr;
    }
        // go to bad exit if already initilized
catch (KeyNotFoundException ex) {
        int defaultValue = 1;
        project.GlobalVariables.SetVariable("[email protected]", "globVar1", defaultValue);
        project.Variables["currentValue"].Value = defaultValue.ToString();
        // go to good exit if we initilized
        return null;
    }
}
Сразу скажу, код не образцовый и возможно вообще бред)
 

Andi88

Client
Регистрация
17.10.2015
Сообщения
228
Благодарностей
26
Баллы
28
Перед этим кодом стоит взятие из списка, по неудаче
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
я не понимаю смысла этих return null и не понимаю как попадает в значение 0
все лочится, у вас в логике где то ошибка значит
 
  • Спасибо
Реакции: Andi88

Andi88

Client
Регистрация
17.10.2015
Сообщения
228
Благодарностей
26
Баллы
28
я не понимаю смысла этих return null и не понимаю как попадает в значение 0
все лочится, у вас в логике где то ошибка значит
Return null - делает выход по красной стрелке?
значение 0 или другое отличное от 1 я ставлю сам, когда выполнено добавление в список, если лочится, то это хорошо, пересмотрю шаблон)
 

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