Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2012, 19:09   #1
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
Восклицание Как нескольким потокам брать строку из одного списка по очереди?

Привет.

Не нашел решения. Нужно, что бы каждый из потоков брал строку из списка, но такую, которую другие потоки еще не брали, например, первый поток взял 1-ю строку, второй - 2-ю, третий - 3-ю, n-ый n-ю...

В обработчике нажатия вот что:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   MyThread: TThread;
begin
[...]
   MyThread:=Thr.Create;
[...]
end;
В процедуре Execute потока вот что (поток качает страницу и далет с ней что-нибудь):

Код:
[...]
var
   http: THTTPSend;
[...]
begin
[...]
   http := THTTPSend.Create;
   http.Protocol := '1.1';
   try
      http.Clear;
      http.HTTPMethod('GET', Here_Is_The_URL_From_List);
   finally
      http.Free;
   end;
[...]
Вот как сюда "Here_Is_The_URL_From_List" передавать номер той строки, которую еще ни один поток не брал?

Ну не грузить же список в Мемо и не передавать же через synchronize?

Выручайте, господа!
trafbite вне форума Ответить с цитированием
Старый 07.03.2012, 19:14   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

синхронизация между потоками, через критическую секцию.
Цитата:
вошел в секцию
взял строку
увеличил счетчик
вышел.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.03.2012, 19:18   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Мемо то зачем? Можно и в StringList держать. Но синхронизировать получение строки все равно прийдется. Нет желания synchronize использовать? Как вариант используйте критическую секцию для синхронизации
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.03.2012, 19:33   #4
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

По критической секции понял, спасибо!
А если у меня (условно) 200 МЛН страниц - StringList и, тем более, Memo не загрузишь ? Выход только БД?
trafbite вне форума Ответить с цитированием
Старый 07.03.2012, 19:34   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Если число поок даст юзер:
Число строк делим на число потоков, остаток забрасываем последнему потоку.

Если надо динамически:
или число потоков задаем по словию, чтобы ихбыло не больше 57, но и строк на каждый поток не приходилось более N, и таким вот образом считаем.
Человек_Борща вне форума Ответить с цитированием
Старый 07.03.2012, 19:37   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Число строк делим на число потоков, остаток забрасываем последнему потоку.
не стоит так делать, тогда в итоге часть потоков будет простаивать, хотя могли бы они и взять задание.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.03.2012, 19:38   #7
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

А что если не грузить в память весь список, а в критической секции инкрементировать счетчик и брать нужную строку из файла. Тогда получается в каждом потоке при каждом проходе будет обращение к файлу - это же не есть гуд?

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
не стоит так делать, тогда в итоге часть потоков будет простаивать, хотя могли бы они и взять задание.
Хоть и не силен, но соглашусь

Последний раз редактировалось Stilet; 11.03.2012 в 15:00.
trafbite вне форума Ответить с цитированием
Старый 07.03.2012, 19:40   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А что если не грузить в память весь список, а в критической секции инкрементировать счетчик и брать нужную строку из файла. Тогда получается в каждом потоке при каждом проходе будет обращение к файлу - это же не есть гуд?
ну с файлом счетчик как бы не нужен.
вошел в секцию
прочел строку
вышел из секции.
Цитата:
Хоть и не силен, но соглашусь
я просто сталкивался с таким уже.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.03.2012, 19:44   #9
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну с файлом счетчик как бы не нужен.
вошел в секцию
прочел строку
вышел из секции.
Как же не нужен, а как тогда поток поймет какую именно строку ему брать?
trafbite вне форума Ответить с цитированием
Старый 07.03.2012, 19:55   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а не нужно файл все время открывать, первый поток открыл, последний закрыл.
в итоге позиция файлового указателя сохраняется.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многократный запуск одного макроса для обработки информации по нескольким заказам поочередно Ribun Microsoft Office Access 1 30.06.2011 09:36
Копировать строку фильтрованного списка в другую книгу, на последнюю пустую строку Gvaridos Microsoft Office Excel 11 24.11.2010 00:48
Как скопировать строку из одного Stringgrida в другой? Pinkygirl Общие вопросы Delphi 1 16.01.2010 23:25
Списка. Стеки, очереди, Кольца c++ megavolt91 Помощь студентам 0 01.06.2009 20:23
как раскидать сгруппированные данные из одного стобца по нескольким hudoi Microsoft Office Excel 2 07.02.2007 23:42