![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
потоки
Аврам © (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;
т.к. некоторые значения (данные) в гриде очень малы и высчитываются быстро, а быстрое появление результатов для меня важно.
Жду ответов и советов, спасибо!
Аврам (2008-04-16 17:14:00) [101]затрудняюсь сказать, так как плохо понимаю терминологию. (не знаю просто).
Palladin (2008-04-16 17:06:00) [102]
> с одинаковым p ~ 100-150.
ok, если это так... дальше, алгоритм обработки линейный или циклический?
Аврам (2008-04-16 17:02:00) [103]с одинаковым p ~ 100-150.
если не хранит даныне на форме то где и как? то что нельзя обращаться к vcl я слышал много раз, а почему и как правильно не видел нигде)))))
Palladin (2008-04-16 16:58:00) [104]
> ANB
> А перво-наперво : не обращайся из потоков к объектам на
> форме.
обоснуй. я вот обращаюсь...
> Аврам
если ты хочешь устроить "царя горы" давай сразу проясним количественную составляющую потоков. сколь много может поступить данных с одинаковым P?
Dennis I. Komarov (2008-04-16 16:46:00) [105]> [41] Аврам (16.04.08 16:35)
Кто заставляет там хранить данные
+
[38]
Аврам (2008-04-16 16:35:00) [106]ну если создать tstringlist - то это тоже будет объект формы....но я не уверен, потому и спрашиваю.
Dennis I. Komarov (2008-04-16 16:33:00) [107]> [39] Аврам (16.04.08 16:30)
А почему инфа должна храниться на форме?
Аврам (2008-04-16 16:30:00) [108]все говорят не обращаться из потоков к объектам на форме.
а если мне надо взять инфу из какого то списка, ка ктогда быть?
Dennis I. Komarov (2008-04-16 16:26:00) [109]Алгоритм анализа не озвучен. Ни о чем... Логика в нем!!!
ANB (2008-04-16 16:16:00) [110]
> Еще не понятно, как быть с этим делом...создавать 100 потоков
> или по 10 потоков и освобожденным давать новые данные на
> анализ...
Опять таки ИМХО : если до этого не работал с потоками, то скорее всего вместо правильного результата, полученного последовательной обработкой, ты получишь непонятные AV и снова придешь на форум.
А перво-наперво : не обращайсяиз потоков к объектам на форме.
ANB (2008-04-16 16:13:00) [111]Ни хрена не понял.
1) зачем проверять строку 100 раз. ?
2) какова цель этих проверок ?
т.е. нужно найти первую попавшуюся "проверенную" строку ? Или "проверить" все строки ?
ЗЫ. ИМХО : скорее всего надо бы загрузить исходные данные в таблицу БД и через минуту получить ответ обычным запросом.
Аврам (2008-04-16 16:10:00) [112]тач пад глючит у ноута
правильней так:
очень благодарен что мне помагаете! Спасибо!
значит так...Постараюсь описать всю задачу.
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 потоков и освобожденным давать новые данные на анализ...
С уважением А.
Аврам (2008-04-16 16:07:00) [113]я очень благодарен что мне помагаете! Спасибо!
значит так...Постараюсь описать всю задачу.
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 и т.д.
Dennis I. Komarov (2008-04-16 15:42:00) [114]> [32] Аврам (16.04.08 15:31)
Ну это конечно все ужасно... :)
Начнем с логики
Есть 20000 строк (не советую их в Grid сувать но не в том суть)
...
пиши далее
Аврам (2008-04-16 15:31:00) [115]форма:
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 14:03:00) [116]> [30] Аврам (16.04.08 13:56)
Ну Terminate им и все. Но мне кажется тут надо логику исправлять. Вобщем надо исходные данные, а не [0]
Аврам (2008-04-16 13:56:00) [117]в зависимости от кол-ва входных данных. в среднем в моей выборке часов 5 (дело в том что на сотню записей приходится один результат, он может быть и 99 по счету, а все до этого будут считаться и ничего не находить, а этот 99 поток который будет результирующим посчитается очень быстро и работа других с 1-98,100 - просто ненужны и их можно будет вырубить), я проверил запустил сотню потоков одновременно и специально засунул строчку с быстрым результатом. через 10 сек в memo добавился результат. что очень быстро для меня), но в диспетчере задач приложение все еще было достаточно загруженно 20мб, и постепенно уменьшалась.т.е. потоки другие еще работали. вот их нуно как то уничтожить)
Dennis I. Komarov (2008-04-16 13:42:00) [118]> [27] Аврам (16.04.08 13:39)
Сколько времени занимает обработка данных в одном потоке?
Сергей М. (2008-04-16 13:40:00) [119]
> чтобы быстрее
Мультипоточность не увеличивает сквозную производительность алгоритма приложения.
Аврам (2008-04-16 13:39:00) [120]для того чтобы быстрее получать нужные мне результаты.