For и потоки
-
Знающие, помогите реализовать следующий алгоритм.
Существуют 100 строк, которые нужно вбить в текстовую строку под разными параметрами на сайте. То есть, у сайта существуют разные настройки (меняются на сайте через комбобоксы), которые нужно менять перед каждым вбиванием 100 строк. Настройка сайта 1 - вбить 100 строк - настройка сайта 2 - вбить 100 строк и т.д. Всего около 300 таких "настроек", которые я собираюсь перебирать через вложенные друг в друга for. Соответственно на самом последнем уровне for вбиваются строки.
Для забивания строк я хочу использовать 10 потоков.
Проблема в том, что пока вбиваются строки, настройки сайтаменять нельзя. То есть на вбивании 90-100 строк, один из потоков может уйти на смену настроек, а другие в это время еще будут вбивать строки. Я хочу этого избежать.Скажите, пожалуйста, как не давать потоку уходить на смену настроек, пока все 100 строк не вбиты под одними настройками сайта?
Использовал foreach для ввода строк(для счета использовал ресурс с 100 строками единичек) но есть проблема преждевременного ухода потоков на смену настроек
-
Тут уже просили функцию, которая выполнялась бы в самом конце, но пока не реализована(
Как вариант, через обычный if, берешь свою последнюю строку из файла с ресурсами и сравниваешь, если совпадает, сохраняешь настройки файла.
-
@RaunOWW
Спасибо за совет, но проблема в том, что необязательно последняя строка в файле будет вбита последней на сайте из-за различной скорости загрузки, зависания потоков и возможных ошибок.
Здесь необходимо какое-то условие об исчерпании ресурса в цикле, или принципиально иной способ перебирания строк...
Без потоков совсем нет проблемы написать такой алгоритм, а вот с потоками трабла.
-
@bvvcpa Сделать глобальную переменную, к которой в конце каждого выполнения потока будет прибавляться 1, и проверку, если там у тебя 10 выполнений должно произойти, то цифра 10 в глобальной переменной, и тогда выполнить сохранение настроек. Как-то так...
-
@bvvcpa Я так понимаю, что вам нужна функция lock, которая дает возможность выполнять код только в одном потоке. В нее нужно обернуть все что идет после load.
Пока этой функции нет, но ее можно легко реализовать:
- В OnApplicationStart создаем глобальную переменную с значением 0
- Перед началом циклов ждем пока она не будет равна 0.
- Если она равна 0 устанавливаем ее в 1 и заполняем комбобоксы и строки.
- Когда все заполнено устанавливаем обратно в 0.
Вот пример реализации.
-
@support
Спасибо, но вроде не то, что нужно, либо я не понял смысл функции.
Решил свою проблему следующим образом:
Создал глобальную переменную, которая считает потоки при выходе из for заполнения строк. Соответственно, если поток вышел из цикла заполнения строк, он добавляет к счетчику + 1.
далее поставил while , где через каждую секунду проверяется условие счетчика на количество потоков. Если счетчик равен количество количеству потоков - происходит выход из while.
Далее, условием проверяю номера потоков, если поток первый, то он меняет настройки, сбрасывает счетчик и заходит в цикл заполнения строк. Остальные спят время и тоже заходят в цикл заполнения строк.
Как-то так) Всем спасибо!