Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Вниз

потоки   Найти похожие ветки 

 
Аврам   (2008-04-15 21:43) [0]

на форме валяется грид, заполненные данными.
строчек ~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;

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

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


 
Palladin ©   (2008-04-15 22:03) [1]

и из-за 20-25 строчек ты решил заморочится на распараллеливании обработки?
это из пушки по воробьям...


 
Аврам   (2008-04-15 22:05) [2]

20-25 это неверные данные. строчек много больше.


 
Аврам   (2008-04-15 22:09) [3]

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


 
Palladin ©   (2008-04-15 22:10) [4]

:)) я просто непонимаю, как можно расчитывать на грамотный совет, по ложным данным

уточняй сразу, где там еще неверные данные?


 
Reindeer Moss Eater ©   (2008-04-15 22:13) [5]

как делать правильно?

правильно грохнуть все разом.


 
Palladin ©   (2008-04-15 22:13) [6]

:)) я просто непонимаю, как можно расчитывать на грамотный совет, по ложным данным

уточняй сразу, где там еще неверные данные?


 
Palladin ©   (2008-04-15 22:18) [7]

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


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

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


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

таперь строчек будет 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. и так для каждого.


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


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


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


 
Palladin ©   (2008-04-15 22:21) [10]

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


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

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


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

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


 
MetalFan ©   (2008-04-15 22:37) [13]

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


 
Palladin ©   (2008-04-15 22:37) [14]

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


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


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

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


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


ок, спасибо!


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

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


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


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


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


 
Riply ©   (2008-04-16 10:23) [18]

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

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


 
Dennis I. Komarov ©   (2008-04-16 11:15) [19]

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

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


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


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


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


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


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

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


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

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


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

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


 
Dennis I. Komarov ©   (2008-04-16 12:49) [24]

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

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


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


> Dennis I. Komarov

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


 
Dennis I. Komarov ©   (2008-04-16 13:27) [26]

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

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


 
Аврам   (2008-04-16 13:39) [27]

для того чтобы быстрее получать нужные мне результаты.


 
Сергей М. ©   (2008-04-16 13:40) [28]


> чтобы быстрее


Мультипоточность не увеличивает сквозную производительность алгоритма приложения.


 
Dennis I. Komarov ©   (2008-04-16 13:42) [29]

> [27] Аврам   (16.04.08 13:39)

Сколько времени занимает обработка данных в одном потоке?


 
Аврам   (2008-04-16 13:56) [30]

в зависимости от кол-ва входных данных. в среднем в моей выборке часов 5 (дело в том что на сотню записей приходится один результат, он может быть и 99 по счету, а все до этого будут считаться и ничего не находить, а этот 99 поток который будет результирующим посчитается очень быстро и работа других с 1-98,100 - просто ненужны и их можно будет вырубить), я проверил запустил сотню потоков одновременно и специально засунул строчку с быстрым результатом. через 10 сек в memo добавился результат. что очень быстро для меня), но в диспетчере задач приложение все еще было достаточно загруженно 20мб, и постепенно уменьшалась.т.е. потоки другие еще работали. вот их нуно как то уничтожить)


 
Dennis I. Komarov ©   (2008-04-16 14:03) [31]

> [30] Аврам   (16.04.08 13:56)

Ну Terminate им и все. Но мне кажется тут надо логику исправлять. Вобщем надо исходные данные, а не [0]


 
Аврам   (2008-04-16 15:31) [32]

форма:
procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
 gg:txz;
begin
for i:=0 to 50 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;

поток:
type
 TXZ = class(TThread)
 private
   { Private declarations }
 protected
   s:string;
   procedure start;
   procedure stop;
   procedure update;
   procedure Execute; override;
 public
       constructor Create;
 end;

constructor TXZ.Create;
begin
 inherited Create(True); //Созданный поток создается в приостановленном состоянии
 Self.Priority := tpNormal; //Очень высокий приоритет
 Resume;
end;

function DeleteGridRow( AGrid: TStringGrid; ARow: integer ): boolean;
var
i: integer;
begin
result := assigned( AGrid ) and
(AGrid.RowCount > AGrid.FixedRows) and
(ARow >= AGrid.FixedRows ) and
(ARow < AGrid.RowCount);
if not Result then Exit;
for i := ARow to AGrid.RowCount - 2 do
AGrid.Rows[i].Assign(AGrid.Rows[i+1]);
if AGrid.RowCount > (AGrid.FixedRows)+1 then
AGrid.RowCount := AGrid.RowCount -1
else
AGrid.Rows[AGrid.FixedRows].Clear;
end;

procedure TXZ.Execute;
var
 list:string;
begin
 Synchronize(start);
 ...
 // код анализа, довольно громозкий
 ...
 if result = -1 then
   Synchronize(update);
end;

procedure TXZ.start;
begin
s := form1.grid.cells[0,0];
DeleteGridRow(form1.grid,0);
end;

procedure TXZ.update;
begin
form1.ListBox2.Items.Add(s);
end;


 
Dennis I. Komarov ©   (2008-04-16 15:42) [33]

> [32] Аврам   (16.04.08 15:31)

Ну это конечно все ужасно... :)

Начнем с логики

Есть 20000 строк (не советую их в Grid сувать но не в том суть)
...
пиши далее


 
Аврам   (2008-04-16 16:07) [34]

я очень благодарен что мне помагаете! Спасибо!
значит так...Постараюсь описать всю задачу.
Count := 100;
Скажем заранее создан список каких то значений. Например
| id | name | NY | param1 | param2 |
| 1 | t1      |      | 0,111   | 4,1       |
| 2 | t2      |      | 0,002   | 5,1       |
| 3 | t3      |      | 0,123   | 2,1       |
| 4 | u1      |      | 0,312   | 4,5       |
| 5 | u2      |      | 0,324   | 3,8       |
| 6 | u3      |      | 0,213   | 7,3       |
|...| ...       |      |  ....     |  ....      |

кол-во столбцев param* может быть и больше двух.

попробовав используя потоки.
для первой строчки создал список из count(100) строчек и создал как показывал выше 100 потоков. ловольно быстро получил результат :) но остальные потоки продолжали работать.
Я так понимаю что хорошо бы создавать для каждой строчки группу потоков и при нахождении выключать ее.
Еще не понятно, как быть с этим делом...создавать 100 потоков или по 10 потоков и освобожденным давать новые данные на анализ...
С уважением А.
обычная процедура как я делал с самого начала без потоков брала первую строчку из списка и пускала в процедуре анализ этой строки. Переменная count как раз говорит сколько раз надо проверить каждую строчку.
Т.е. 100 раз первую сто раз вторую.
типа for i:=0 to count -1 do begin
Если найден результат по заданым мной критериям и i= 19  то в поле NY мы добавляем результат например 0,0102 и переходим к анализу строчки с id =2 и т.д.


 
Аврам   (2008-04-16 16:10) [35]

тач пад глючит у ноута
правильней так:

очень благодарен что мне помагаете! Спасибо!
значит так...Постараюсь описать всю задачу.
Count := 100;
Скажем заранее создан список каких то значений. Например
| id | name | NY | param1 | param2 |
| 1 | t1      |      | 0,111   | 4,1       |
| 2 | t2      |      | 0,002   | 5,1       |
| 3 | t3      |      | 0,123   | 2,1       |
| 4 | u1      |      | 0,312   | 4,5       |
| 5 | u2      |      | 0,324   | 3,8       |
| 6 | u3      |      | 0,213   | 7,3       |
|...| ...       |      |  ....     |  ....      |

кол-во столбцев param* может быть и больше двух.

обычная процедура как я делал с самого начала без потоков брала первую строчку из списка и пускала в процедуре анализ этой строки. Переменная count как раз говорит сколько раз надо проверить каждую строчку.
Т.е. 100 раз первую сто раз вторую.
типа for i:=0 to count -1 do begin
Если найден результат по заданым мной критериям и i= 19  то в поле NY мы добавляем результат например 0,0102 и переходим к анализу строчки с id =2 и т.д.

попробовав используя потоки.
для первой строчки создал список из count(100) строчек и создал как показывал выше 100 потоков. ловольно быстро получил результат :) но остальные потоки продолжали работать.
Я так понимаю что хорошо бы создавать для каждой строчки группу потоков и при нахождении выключать ее.

Еще не понятно, как быть с этим делом...создавать 100 потоков или по 10 потоков и освобожденным давать новые данные на анализ...
С уважением А.


 
ANB   (2008-04-16 16:13) [36]

Ни хрена не понял.
1) зачем проверять строку 100 раз. ?
2) какова цель этих проверок ?
т.е. нужно найти первую попавшуюся "проверенную" строку ? Или "проверить" все строки ?

ЗЫ. ИМХО : скорее всего надо бы загрузить исходные данные в таблицу БД и через минуту получить ответ обычным запросом.


 
ANB   (2008-04-16 16:16) [37]


> Еще не понятно, как быть с этим делом...создавать 100 потоков
> или по 10 потоков и освобожденным давать новые данные на
> анализ...

Опять таки ИМХО : если до этого не работал с потоками, то скорее всего вместо правильного результата, полученного последовательной обработкой, ты получишь непонятные AV и снова придешь на форум.
А перво-наперво : не обращайся из потоков к объектам на форме.


 
Dennis I. Komarov ©   (2008-04-16 16:26) [38]

Алгоритм анализа не озвучен. Ни о чем... Логика в нем!!!


 
Аврам   (2008-04-16 16:30) [39]

все говорят не обращаться из потоков к объектам на форме.
а если мне надо взять инфу из какого то списка, ка ктогда быть?


 
Dennis I. Komarov ©   (2008-04-16 16:33) [40]

> [39] Аврам   (16.04.08 16:30)

А почему инфа должна храниться на форме?



Страницы: 1 2 3 4 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.063 c
2-1208842288
Динис_ИС
2008-04-22 09:31
2008.05.18
Многострочный Label


2-1208425578
VictoR407
2008-04-17 13:46
2008.05.18
Как удалить полосы прокрутки в компоненте treeview?


2-1208768164
umbra
2008-04-21 12:56
2008.05.18
как из TAction.Execute узнать, на какой форме кликнули меню


15-1207417988
No_Dead
2008-04-05 21:53
2008.05.18
Мне страшно%> комп живет своей жизнью


2-1208291529
Res
2008-04-16 00:32
2008.05.18
mx запись





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский