Работа с переменными в основном постере.

darknight

Client
Регистрация
28.09.2013
Сообщения
104
Благодарностей
4
Баллы
18
Всем привет, благодарю за помощь авансом :-)
Возник вопрос.
Нужна реализация массовой регистрации аккаунтов с активацией и прочим(оно по сути уже сделано).
Все работает, только не получилось разобраться со счетчиками.
1. Сделал в самом начале проекта увеличение переменной Х на 1, после чего из таблицы берутся нужные данные из строки 1, столбца 0, 1, 2, 3 etc. (юзернейм:пасс:мейл:мейлпасс:имя:фимилия) итп.
Ну почему-то каждый запущеный инстанс = тому что он начинается с того-же +1 счетчика, то есть следующую строку переменные получают на 2, а опять-же 1.
Если же в отладке реализовать цикл - то по идее все будет как задумывалось, но 1 поток это не серьезно :-)
Ну да ладно, попытался реализовать это другим способом:
1. Берем из файла строку, в моем случае строка это число 0.
2. Увеличиваем её на 1 и перезаписываем файл.
3. Считываем файл и полученный результат подставляем во все переменные которые используют номер строки из таблицы.
Все, по логике каждый запущеный инстанс должен увеличивать значение в файле и брать на 1 строку ниже, но нет, инстансы как-будто запускаются одновременно и все используют один и тот-же номер, то есть 1, не увеличивая нумерацию.
При одном запущеном инстансе вроде бы все нормально, но бывает тоже пишет что этот юзернейм уже использовался.

Может можете подсказать как это реализовать более надеждным и провереным способом?
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 451
Благодарностей
1 885
Баллы
113
Всё правильно. Вы используете внутренний счетчик. Он для каждого инстанса запускается отдельно.
Если нужно брать строки поочередно, то можно либо просто брать первую строку с удалением, либо же, если их нужно оставлять в файле, то все равно брать первую строку с удалением и записывать её в конец этого файла в следующем шаге.
 

darknight

Client
Регистрация
28.09.2013
Сообщения
104
Благодарностей
4
Баллы
18
Хорошо, спасибо, а описанный мною вариант2. Чем он не правильный, раз инстансы берут в итоге одну и ту-же строку?
 

darknight

Client
Регистрация
28.09.2013
Сообщения
104
Благодарностей
4
Баллы
18
По сути там же постоянное изменение файла, он перезаписывается практически сразу после старта инстанса, я просто к чему:
Я боюсь что тогда и обычное удаление и перенос строк так-же себя поведет, 25 инстансов будут брать одну и туже строку.
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 451
Благодарностей
1 885
Баллы
113
Не совсем понял как вы там всё реализовывали. Если сделаете как написал я, то всё будет работать. Главное делайте это через список, привязанный к нужному файлу.
В таком случае, если перезаписывать данные назад в файл, строки могут перемешаться, но браться одинаковые строки не будут.
 

darknight

Client
Регистрация
28.09.2013
Сообщения
104
Благодарностей
4
Баллы
18
Ок, я попробую, опишу подробней как сделал второй вариант:
Создан txt файл с цифрой "0" в нулевой строке.
1. При запуске истанса он считывается
2. Его значение увеличивается на 1.
3. Он снова считывается, уже со значением 1.
4. Эта переменная присваивается всем операциям на таблицей в поле, где нужно взять строку.
5. Мы получаем строку 1.

В моем понимании каждый запущенный инстанс должен взять строку +1.
Но нет. Они все почему работают с одной.
 

bigcajones

Client
Регистрация
09.02.2011
Сообщения
1 216
Благодарностей
683
Баллы
113
  • Спасибо
Реакции: darknight

darknight

Client
Регистрация
28.09.2013
Сообщения
104
Благодарностей
4
Баллы
18
Не понял назначения паузы в файле, можно подробней пожалуйста? Удаление строки дума реализовать в середине проекта, если аккаунт с таким юзернеймом или мейлом не занят.
Не ищу готового решения, хотелось бы понять, что сам делаю не так.
Файл пишется в начале проекта, значит следующий инстанс должен брать обновленный файл со значением 2, но выставляя 25 потоков, все 25 инстансов получают строку номер 1.
 

bigcajones

Client
Регистрация
09.02.2011
Сообщения
1 216
Благодарностей
683
Баллы
113
Пауза как раз то, от отрицательных выйти в случае пустой строки в таблице.

Линии, указанного в таблице связаны с файлов и удалить в файле, поэтому другие потоки будут тянуть новую линию из файла. Каждый поток работает с отдельной строкой в ​​файле. В примере, линии, которая была вытащил из файла записывается обратно в файл в конце. Надеюсь, Google Translate работает, и вы понимаете.

TC вы можете мне помочь здесь с объяснением
 
  • Спасибо
Реакции: darknight

darknight

Client
Регистрация
28.09.2013
Сообщения
104
Благодарностей
4
Баллы
18
К сожалению пока не получилось реализовать как я этого хотел бы, без удаления. Вроде бы в моем понимании логика построена правильно. Но результат совсем не тот.
Файл приложил: все файлы для теста делал в корне C:/
Project_for_test
Может кто-то посмотреть пожалуйста и сказать в чем ошибка?
В результате должен получать правильную нумерацию 1, 2, 3, 4, 5, 6 etc. А результаты дублируются(только при многопотоке) в 1 потоке и при отладке все работает как задумывал.
 

realman

Client
Регистрация
01.10.2013
Сообщения
50
Благодарностей
4
Баллы
8
я думаю проблема в одновременном доступе. т.е. пока ты берешь число, увеличиваешь его и записываешь обратно, в этот момент все остальыне инстансы берут старое число. в итоге если все запустить одновременно когда в файле 0, то может получиться что в итоге будет лишь 1 :-)

чтобы не было конфликта при одновременном доступе нужно брать и изменять файл за одну операцию, а не растягивать на две как у тебя. такое возможно только если брать строку с удалением. все остальыне операции над файлами будут делить на два действия минимум.

если очень сильно надо именно счетчик, то можно создать файл в котором будут записаны все числа поочереди
1
2
3
4
5
и так далее.

и работать точно так же брать строку с удалением.


надеюсь понятно объяснил :-)
 
  • Спасибо
Реакции: darknight

darknight

Client
Регистрация
28.09.2013
Сообщения
104
Благодарностей
4
Баллы
18
Да, нумерация в файле нормальное решение, раз с удалением поставленная задача работает. Спасибо, попробую сейчас на тестовом и отпишу.
 

darknight

Client
Регистрация
28.09.2013
Сообщения
104
Благодарностей
4
Баллы
18
Работает, спасибо огромное! :-)
 

PainShaft

Client
Регистрация
28.08.2013
Сообщения
38
Благодарностей
6
Баллы
8
Ну и что это разве нормальное решение? Для чего то записывать числа в отдельный файл и брать их по очереди, когда уже сделают нормальную многопоточность разработчки...
 

rostonix

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

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