Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

помогите с разобраться с потоками [D7]


Страницы:   1 2 3

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!!!
Очень интересно. Буду ковыряться :)
Если что, можно обращаться с дополнительными вопросами?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо