Многопоток)

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

Andi88

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

Вложения

  • doki.zip
    doki.zip
    23,8 KB · Просмотры: 229
По логике да, а по логике многопотока?
Никакой другой логики не существует. В многопотоке есть особенности, но логика всё та же.
Ведь все проекты стартуют одновременно.
Ну, и что?
Тоесть если один обнаружит в этот момент это может обнаружить и другой))(пробовал так делать с помощью глобальной переменной(флаг). С самого начала делал проверку глобальной переменной, если пустая(запуск первый раз) то создаётся список (и ставится значение 1), если 1 то берётся строка (делал под 1 круг), но почему то не получилось, проскакивали одновременно.
На счёт глюков с глобальными переменными довольно часто пишут люди на форуме. Я предпочитаю файлы.
 
Как другие потоки будут узнавать о том, что список уже обрабатывается, чтобы они в свою очередь не запускали пополнение списка?
Отдельный шаблон с вечным циклом для пополнения списка предлагаете запускать?
 
Как другие потоки будут узнавать о том, что список уже обрабатывается, чтобы они в свою очередь не запускали пополнение списка?
Отдельный шаблон с вечным циклом для пополнения списка предлагаете запускать?
а как потоки расценивают такую конструкцию?
lock(SyncObject)
{
код
}
 
На счёт глюков с глобальными переменными довольно часто пишут люди на форуме. Я предпочитаю файлы.
Не припомню ни одного сообщения пользователя про глобальные, в котором был бы доказан глюк с ними за последний год)
Все там работает замечательно. Сам пользуюсь.
 
Не припомню ни одного сообщения пользователя про глобальные, в котором был бы доказан глюк с ними за последний год)
Все там работает замечательно. Сам пользуюсь.
Я с того времени и не пользовался.

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

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