![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите с разобраться с потоками [D7]
Zahar © (2005-01-09 15:31:00)Помогите плиз разобраться с потоками. Нашел кучу информации где разные потоки выполняют разные функции, а мне нужно чтобы все потоки выполняли одну и ту же операцию.
Задача дла примера:
Есть текстовый файл в котором N-строк с числами (для примера возьмем 300).
Каждый поток должен прочитать из этого файла по M-записей (например 50), проделать над ними определенные преобразования и записать в другой текстовый файл.
Таким образом, как я понимаю, динамически должно быть создано 6 потоков (300/50=6) каждый из которых возьмет свою часть записей из исходного файла:
Thread 1 - 1..50
Thread 2 - 51..100
Thread 3 - 101..150
Thread 4 - 151..200
Thread 5 - 201..250
Thread 6 - 251..300
Для примера каждое число нужно умножить на 2 и записать в конечный файл.
Т.е. функция для потока будет одна, но обрабатывать в каждом потоке она будет разные последовательности данных.
Помогие очень разобраться с этой задачей. В потоках я полный новичек.
Заранее благодарен за любую помощь.
sniknik (2005-01-10 17:04:00) [1]olookin © (10.01.05 15:30) [46]
нельзя! ни в коем случае (даже если на первый взгяд кажется что можно, и не с чем не пересекается не изменяется и .т.д.)
всегда есть вероятность (и очень очень большая) что гдето чтото не учел, мало ли событий в которых туда же обращение и блокировки ставятся. (onPaint например, ты учитывал? в нем тоже должно быть обращение к компонентам формы) а если вдруг исключение будет? там по ексепту VCL-ная форма с мессажем подымается, в потоке это недопустимо.
olookin (2005-01-10 15:30:00) [2][45] sniknik © (10.01.05 14:47)
Согласен, но в отношении моего кода - могу я беспрепятственно читать "имя" компонента, или это тоже чревато?
sniknik (2005-01-10 14:47:00) [3]olookin © (10.01.05 10:30) [39]
> " имелось в виду НАЗНАЧЕНИЕ свойства, а не его чтение.
чтение тоже "чревато" последствиями, ты читаеш другой поток пишет в итоке ты получил неопределенное значение, часть от старого часть нового значения. это хорошо?
ну и потом даже чтение свойства (property) может вызывать довольно сложные процедуры (и на запись тоже) смотря как оно реализовано, а если (например) гдето подсчет вхождений в свойство идет и выход только с парным (вход + выход -, и выйдет только если 0), ты туда влез незапланировано... и в итоге "клинч" ни ты ни основной поток работать не можете, зависли в обработке проперти. (только как пример!)
sniknik (2005-01-10 14:37:00) [4]> ПРи каком "этом"? При многопроцессорности или однопроцессорности?
так понимаю смотря что "тормозит", если расчеты то вряд ли разнесение по потокам даст прирост скорости...
но вот если поток в основном занимается ожиданием события какого нибудь то несколько вполне мугут сработать быстрее (пример FlashGet при закачке в несколько потоков). и неважно сколько процессоров. ;)
KSergey (2005-01-10 12:57:00) [5]> [41] Alexander Panov © (10.01.05 11:14)
> KSergey © (10.01.05 11:11) [40]
> Если система однопроцессорная. Но и при этом условии тоже
> не факт.
ПРи каком "этом"? При многопроцессорности или однопроцессорности?
TUser (2005-01-10 11:29:00) [6]ИМХО, использование нескольких потоков для даннойзадачи нужно непонятно зачем - оно приведет лишь к замедлению работы с файлом.
Alexander Panov (2005-01-10 11:14:00) [7]KSergey © (10.01.05 11:11) [40]
А вообще имейте в виду, что один поток (например - основной) в итоге обработает вась файл быстрее, нежели N параллельных, обрабатывающих разные куски файла.
Если система однопроцессорная. Но и при этом условии тоже не факт. Зависит от того, какая обработка данных проводится , от контроллра дисков, от объема RAM и пр...
KSergey (2005-01-10 11:11:00) [8]> Zahar (09.01.05 15:31)
> Есть текстовый файл в котором N-строк с числами (для примера
> возьмем 300).
Хотелось бы по исходной задаче немного написать.
Если это просто учебная проба - то ладно.
А вообще имейте в виду, что один поток (например - основной) в итоге обработает вась файл быстрее, нежели N параллельных, обрабатывающих разные куски файла.
olookin (2005-01-10 10:30:00) [9][38] begin...end © (10.01.05 09:36)
Да, действительно так. Но мне казалось, что собственно в "Methods and properties of objects in VCL can only be used... " имелось в виду НАЗНАЧЕНИЕ свойства, а не его чтение. Значит, я снова был неправ.
begin...end (2005-01-10 09:36:00) [10]> [37] olookin © (10.01.05 09:03)
Вы в коде [12] обращались к свойствам формы не только в процедуре UpdateLabel, предназначенной для синхронизации, но и непосредственно в методе Execute.
olookin (2005-01-10 09:03:00) [11][22] sniknik © (09.01.05 19:12)
>>не обращайся из потока к внешним переменным и особенно свойствам форм (VCL не потоко безопасна), как в примере olookin - а.
Не знаю, может Вы и правы, но вроде бы как при создании Thread Object в теле юнита пишут такую штуку:
{ Important: Methods and properties of objects in VCLcan only be used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TMyThread.UpdateCaption;
begin
Form1.Caption:= 'Updated in a thread';
end; }
Я все правильно понял?
ASoft (2005-01-10 04:33:00) [12]> Zahar[31] (если например нужно реализовать 300 потоков)
Цитата из книги: "Корпорация Borland не рекомендует создавать в одной програме более 16 процессов, если эта программа работает на однопроцессорном компьютере".
Zahar (2005-01-10 02:30:00) [13]2 sniknik
THX!!!
sniknik (2005-01-10 02:02:00) [14](цикл до 7, 1 лишний (инфу перетрет) и один неправильный (нету такого), для примера)
sniknik (2005-01-10 01:59:00) [15]300? лучше не надо. количество потоков лучше ограничивать минимумом без которого не обойтись, тормозит`с... как бы парадоксально это не звучало.
(на переключения между потоками тоже ресурсы расходуются)
т.что если можно работу выполнить в 1м потоке надо делать в одном, быстрее будет, чем то же самое в разнесенных 10ти например.
а вообше в цикл это легко впихнуть
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
fLabel: TLabel;
begin
randomize;
for i:= 0 to 7 do begin
fLabel:= TLabel(FindComponent('Label'+IntToStr(i+1)));
if fLabel <> nil then TCountThread.Create(fLabel, Label7, i*50, i*50+50);
end;
end;
(присвоение убрал и сам масив тоже, они лишнее сдесь, манипуляций с потоками нет уничтожаются тоже сами...) главное чтобы для 300-т лейбелов хватило ;о)).
Zahar (2005-01-10 01:36:00) [16]Меня конкретно интересует как поставлять соответствующий Label (Label1, Label2, Label3 ...)
Zahar (2005-01-10 01:33:00) [17]Еще один вопрос:
Как следующий код выполнить в виде цикла (если например нужно реализовать 300 потоков):
ArCntThrd[0]:= TCountThread.Create(Label1, Label7, 1, 50);
ArCntThrd[1]:= TCountThread.Create(Label2, Label7, 50, 100);
ArCntThrd[2]:= TCountThread.Create(Label3, Label7, 100, 150);
ArCntThrd[3]:= TCountThread.Create(Label4, Label7, 150, 200);
ArCntThrd[4]:= TCountThread.Create(Label5, Label7, 200, 250);
ArCntThrd[5]:= TCountThread.Create(Label6, Label7, 250, 300);
sniknik (2005-01-09 22:19:00) [18]> Если что, можно обращаться с дополнительными вопросами?
не конкретизируй, скорее ответят. не все же такие нещепетильные как я ;о)) на просьбу к другому отвечать.
Alexander Panov (2005-01-09 21:12:00) [19]Zahar (09.01.05 21:08) [28]
Ты статьи читал на сайте?
Zahar (09.01.05 21:08) [28]
Если что, можно обращаться с дополнительными вопросами?
Для того и форум;)
Zahar (2005-01-09 21:08:00) [20]2 sniknik
COOL!!! THX!!!
Очень интересно. Буду ковыряться :)
Если что, можно обращаться с дополнительными вопросами?