![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Всем привет) Такая проблема возникла.
Есть программа, в ней используются потоки. Причем количество потоков задается числом в edit. Далее, в МЕМО вводятся фамилии, по одной на каждую строчку. И мне нужно в несколько потоков провести одинаковые действия со списком. Естественно встала проблема синхронизации(или как бы это назвать) . Т.е. нужно чтобы одновременно в каждом потоке был обработан свой элемент(не повторяясь). Код прилагаю.(В этом коде все потоки идентичны и выполняют одинаковую работу несколько раз )класс потока: Код:
TMyTr = class(TgsvThread)
http:TidHttp;
protected
procedure Execute; override;
end;Создаем и запускаем их: Код:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=1 to spinedit1.Value do
begin
thr[i]:=TMyTr.Create;
thr[i].Pause(1);
thr[i].Resume;
end;Сам поток выглядит так: Код:
procedure TMyTr.Execute; var //переменные begin //обрабатываем элементы мемо end; Чую, как то можно сделать, но до меня не допрет никак прошу здесь помощи) ЗЫ мб делить список на куски и раздавать каждому потоку свой кусок? незнаю как реализовать... или может есть способ легче? |
|
#2
|
|||
|
|||
|
Делается одрним из 2х способов.
1. Делается поток-диспетчер, который распределяет данные между остальными потоками. Плохо то, что данные будут все-таки целиком обработаны, хотя бы начально, этим самым потоком. 2. Делается очередь. Каждый поток извлекает из нее задание себе сам. При этом извлечение заданий "обернуто" в критическую секцию (CriticalSection). |
|
#3
|
||||
|
||||
|
Цитата:
Вот этим способом можно пробовать. Можешь пример показать, пожалуйста? |
|
#4
|
||||
|
||||
|
Почитал литературу по потокам, нашел решение. Сделал через очередь, а само извлечение из очереди в CriticalSection . Спасибо lmikle
|