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

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

потоки


Страницы:   1 2 3 4 5 6 7 8

Аврам ©   (2008-04-15 21:43:00) 

на форме валяется грид, заполненные данными.
строчек ~20-25 не больше.
по началу написал процедуру которая брала по очереди данные из каждой строчки и анализировала их. потом пришло в голову сделать все это дело через потоки, т.е. загружать например 10 потоков обрабатывать данные, потом по мере анализ освободившиеся потоки начинали обрабатывать следующие данные из грида, пока не проанализируются все.
можно ли так делать? если нет то почему? и как делать грамотней в этом случае?
решение о использовании потоков появилось когда попробовал запустить потоки по сразу всем данным типо того:
for i:=0 to grid.rowount -1 do
begin
     gg := txz.create;
   try
     with gg do
     begin
       Inc(FThreadRefCount);
       Resume;
     end;
   except on EConvertError do
     begin
       gg.Free;
       ShowMessage('That is not a valid number!');
     end;
   end;
end;
end;

т.к. некоторые значения (данные) в гриде очень малы и высчитываются быстро, а быстрое появление результатов для меня важно.

Жду ответов и советов, спасибо!


Dennis I. Komarov   (2008-04-16 13:27:00) [121]

> [25] Аврам   (16.04.08 13:23)

На кой ляд тебе вообще они понадобилися?


Аврам   (2008-04-16 13:23:00) [122]


> Dennis I. Komarov

не понял,вы предлагает сделать всего два потока?
к сожалению опыт работы с потоками у меня очень мал, просьба отвечать более ясно, а то возникают новые вопросы.
не понимаю чем предложенная мной конструкция неправильна.
с 10-20 потоков аналязят данные,если какой то поток нашел получил результат, то выводит его на vcl, а другой единственный поток который мониторит получения результатов и состояния потоков (ведь какие то потоки просто закончат работу не найдя результата) просто вырубает группу потоков, чтобы их место заняли новые.


Dennis I. Komarov   (2008-04-16 12:49:00) [123]

> [23] Аврам   (16.04.08 12:22)

Должен один отвечать за GUI, второй обрабатывать данные и выводить результаты на GUI. В данном случае обработку данных можно поручить первому. ИМХО!


Аврам   (2008-04-16 12:22:00) [124]

спасибо за ответы!
ну типо того, кто быстрее тот и хороший, а остальные надо вырубить. т.е. должен быть еще один поток который мониторит появление результатов и если они появляются то соответствущую группу потоков уничтожает.


ANB   (2008-04-16 11:58:00) [125]

Классика распараллелки (примеров не просить, они все равно на Pl/SQL и сильно не помогут, но идея та же).
1. Подготовить более менее однородный список данных для обработки. Строки списка не должны зависеть друг от друга, т.е. должно быть все равно в каком порядке их обрабатывать.
2. Если он достаточно здоровый, что последовательное выполнение займет много времени, и при этом у вас имеется комп с несколькими процессами/ядрами (иначе эффекта все равно не будет, у нас эффект есть, но процессоров на сервере - 64), то начинаем заниматься распараллеливанием.
3. Определяем по количеству данных количество параллельных процессов (их не имеет смысла все равно делать более числа реальных процессоров/ядер).
4. Распределяем строки списка по процессам.
5. Подготовливаем задания/треды. Каждому треду копируем его кусок списка(мона брать и из общей кучи, но при этом нужно решить проблему потокобезопасности, мы этим не заморачиваемся - за нас уже все сделал оракл)
6. Стартуем задания и мониторим ход их выполнения. Обмениваться данными между потоками и монитором лучше всего через PostMessage - меньше тормозов и не надо ждать синхронных ответов. Не надо делать обмен информационными сообщениями слишком частым. В цикле ожидания монитора обязательно либо воткнуть слип хотя бы на 200 мс, либо юзать модальную форму (это не ко мне).


Palladin   (2008-04-16 11:21:00) [126]


> Аврам   (15.04.08 22:18) [8]

не понял юмора, они что, ты что хочешь заставить потоки играть в "кто быстре" чтоли? на кой другие то потоки будут работать с P=5 если все равно "должен остаться только один!" (С) маклауд


tesseract   (2008-04-16 11:20:00) [127]


> я использую Synchronize для получения данных из vcl.


На кой тогда потоки ? А вообще может данные не из грида брать? А из какого-то внешнего источника ? Проверять и выводить в твой грид.


Dennis I. Komarov   (2008-04-16 11:15:00) [128]

> [18] Riply ©   (16.04.08 10:23)

while true do begin end;- освавает на 100% :)


Riply   (2008-04-16 10:23:00) [129]

> [16] Dennis I. Komarov ©   (16.04.08 10:16)
> Может нафиг эти треды? Ну не вижу я смыслу в них тут. Ку?

Ничего то ты не понимаешь :)
Ясно же сказано: "для этой программы заказчик выделил отдельный компьютер!!!"
Надо "осваивать" выделенные средства, а то больше не выделят :)


Сергей М.   (2008-04-16 10:20:00) [130]


> как делать грамотней в этом случае?


см. все касаемое тред-пула


Dennis I. Komarov   (2008-04-16 10:16:00) [131]

Нет, конечно строка строке рознь но из пушки "ты каким номером палил?" (С) Кузьмич
Может нафиг эти треды? Ну не вижу я смыслу в них тут. Ку?


Аврам   (2008-04-15 22:43:00) [132]


> MetalFan ©   (15.04.08 22:37) [13]
> нельзя работать с визуальными компонентами из доп.потоков.
> ..

я использую Synchronize для получения данных из vcl.


> Palladin ©   (15.04.08 22:37) [14]
> если никто не напишет, то завтра напишу тебе примерную схему
> пула потоков и его мониторинга...  на IE5 mobile  писать
> больше 10 сток кода это лучше сразу повесится...


ок, спасибо!


MetalFan   (2008-04-15 22:37:00) [133]

нельзя работать с визуальными компонентами из доп.потоков...


Palladin   (2008-04-15 22:37:00) [134]

если никто не напишет, то завтра напишу тебе примерную схему пула потоков и его мониторинга...  на IE5 mobile  писать больше 10 сток кода это лучше сразу повесится...


Аврам   (2008-04-15 22:28:00) [135]

я так понимаю что у меня должен в памяти создаваться список потоков с ихними хенделами и параметро P, и уничтожать их по мере появления данных..прально?


Аврам   (2008-04-15 22:23:00) [136]

для этой программы заказчик выделил отдельный компьютер!!! :))) так что все норм)
Спасибо за ответы!


Palladin   (2008-04-15 22:21:00) [137]

хотя я лично, вот, ну не вижу никакой выгоды в распараллеливании, вижу лтшь затраты системных ресурсов на старт тредов и их мониторинг...


Аврам   (2008-04-15 22:20:00) [138]


> не стоит на поток обработки вешать работу с vcl объктами.
> ..  кесарю кесарево... я бы организовал монитор поточной
> обработки (тоже поток)...


не понимаю что значит "монитор поточной обработки", может имеется ввиду использование Synchronize в потоке?


Palladin   (2008-04-15 22:18:00) [139]

прошу прощения за дубль, ie mobile млин...


>Аврам (15.04.08 22:09) [3]

не стоит на поток обработки вешать работу с vcl объктами...  кесарю кесарево... я бы организовал монитор поточной обработки (тоже поток)...


Аврам   (2008-04-15 22:18:00) [140]

таперь строчек будет 1000*n :))))
использвую грид потому что:
| P | Z |
|__________
| 5 | 0.1     |
| 5 | 0.01   |
| 5 | 0.2     |
| 5 | 0.6     |
| 5 | 0.009 |
| 6 | 0.1     |
| 6 | 0.3     |
| 6 | 0.0003|

основной параметр есть P, т.е. потоки забирают все эти данные и пока налазят то какой то закончит первым анализ, и как только он закончит то все остальные потоки которые аналязят строчки с этим параметром P надо вырубить т.к. они уже не имеют интереса для дальнейших рассчетов.
т.е. для P = 5 есть 1000 строк, взяли их на анализ 1000 потоков. затем какой то первый поток закончил анализ и вывел результат, сразу же надо выключить все остальные, которые анализируют данные с параметро P = 5. и так для каждого.


Страницы:   1 2 3 4 5 6 7 8

Наверх

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