![]() |
|
|
#1
|
|||
|
|||
|
Здравствуйте, есть поток, в котором выполняется определнный код
Код:
procedure TMyThread1.DoWork; begin for i:=0 to Form1.Listbox1.items.count - 1 do begin // end; end; Уважаемые знатоки, вопрос: "Как сделать мой этот цикл в 10 потоках? или более" ? Отвечает... |
|
#2
|
|||
|
|||
|
В потоках не шарю, но я бы сделал, чтобы поток работал с одним итемом, который при создании ему передается, и при нажатии на кнопку создать по потоку на каждый итем
|
|
#3
|
|||
|
|||
|
Цитата:
![]() |
|
#4
|
||||
|
||||
|
Я в потоках шарю, но все равно не могу понять в чем задача заключается.
|
|
#5
|
|||
|
|||
|
Цитата:
Я сейчас создал массив потоков, вроде все нормально, но каждый из потоков берет одинаковый итем из ЛистБокса, что не желательно... |
|
#6
|
||||
|
||||
|
Можно создать n-е кол-во потоков с такимусловием, что кадый поток будет обрабатывать свой диапазон айтемов.
Или я чето не понимаю в твоей %PROGRAM%. |
|
#7
|
|||
|
|||
|
От лукавого всё это, имхо надо один поток - один итем
Ежели хочется чтобы было 10 одновременно, то запускать их с перерывом в среднеевремяжизни/10 сек |
|
#8
|
|||
|
|||
|
Да не, нужен просто стек заданий.
Каждый поток просто будет брать очередное задание из очереди и обрабатывть его. Если очередь пуста, то поток отключается. Код:
var
CS : TCriticalSection;
procedure TMyThread.Execute;
var
AItem : String;
HaveWork : Boolean;
begin
HaveWork := True;
While HaveWork Do begin
Sleep(30000); // Твоя задержка
S := '';
CS.Enter;
Try
If MainForm.List1.Items.Count > 0 Then
Begin
AItem := MainForm.List1.Items[0];
MainForm.List1.Items.Delete(0);
End;
Finally
CS.Leave;
End;
HaveWorl := S <> '';
If HaveWork Then ProcessItem(AItem); // обработка задания
end; // While
end; |