For и потоки



  • Знающие, помогите реализовать следующий алгоритм.
    Существуют 100 строк, которые нужно вбить в текстовую строку под разными параметрами на сайте. То есть, у сайта существуют разные настройки (меняются на сайте через комбобоксы), которые нужно менять перед каждым вбиванием 100 строк. Настройка сайта 1 - вбить 100 строк - настройка сайта 2 - вбить 100 строк и т.д. Всего около 300 таких "настроек", которые я собираюсь перебирать через вложенные друг в друга for. Соответственно на самом последнем уровне for вбиваются строки.
    Для забивания строк я хочу использовать 10 потоков.
    Проблема в том, что пока вбиваются строки, настройки сайтаменять нельзя. То есть на вбивании 90-100 строк, один из потоков может уйти на смену настроек, а другие в это время еще будут вбивать строки. Я хочу этого избежать.

    Скажите, пожалуйста, как не давать потоку уходить на смену настроек, пока все 100 строк не вбиты под одними настройками сайта?

    Использовал foreach для ввода строк(для счета использовал ресурс с 100 строками единичек) но есть проблема преждевременного ухода потоков на смену настроек0_1477155894738_Снимок.PNG



  • Тут уже просили функцию, которая выполнялась бы в самом конце, но пока не реализована(
    Как вариант, через обычный if, берешь свою последнюю строку из файла с ресурсами и сравниваешь, если совпадает, сохраняешь настройки файла.



  • @RaunOWW
    Спасибо за совет, но проблема в том, что необязательно последняя строка в файле будет вбита последней на сайте из-за различной скорости загрузки, зависания потоков и возможных ошибок.
    Здесь необходимо какое-то условие об исчерпании ресурса в цикле, или принципиально иной способ перебирания строк...
    Без потоков совсем нет проблемы написать такой алгоритм, а вот с потоками трабла.



  • @bvvcpa Сделать глобальную переменную, к которой в конце каждого выполнения потока будет прибавляться 1, и проверку, если там у тебя 10 выполнений должно произойти, то цифра 10 в глобальной переменной, и тогда выполнить сохранение настроек. Как-то так...



  • @bvvcpa Я так понимаю, что вам нужна функция lock, которая дает возможность выполнять код только в одном потоке. В нее нужно обернуть все что идет после load.

    Пока этой функции нет, но ее можно легко реализовать:

    1. В OnApplicationStart создаем глобальную переменную с значением 0
    2. Перед началом циклов ждем пока она не будет равна 0.
    3. Если она равна 0 устанавливаем ее в 1 и заполняем комбобоксы и строки.
    4. Когда все заполнено устанавливаем обратно в 0.

    Вот пример реализации.

    0_1477393636624_lock.xml



  • @support
    Спасибо, но вроде не то, что нужно, либо я не понял смысл функции.
    Решил свою проблему следующим образом:
    Создал глобальную переменную, которая считает потоки при выходе из for заполнения строк. Соответственно, если поток вышел из цикла заполнения строк, он добавляет к счетчику + 1.
    далее поставил while , где через каждую секунду проверяется условие счетчика на количество потоков. Если счетчик равен количество количеству потоков - происходит выход из while.
    Далее, условием проверяю номера потоков, если поток первый, то он меняет настройки, сбрасывает счетчик и заходит в цикл заполнения строк. Остальные спят время и тоже заходят в цикл заполнения строк.
    Как-то так) Всем спасибо!


Log in to reply