![]() |
| ||
|
|
Новости |
Поиск |
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-17 19:44:00) [21]Хотя - пожалуйста. Вот пример:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdHTTP ;
type
TIH=class(TThread)
private
FURL: String;
FH: TIdHTTP;
protected
procedure Execute; override;
public
constructor Create(URL: String);
property H: TIdHTTP read FH write FH;
end;
TForm1 = class(TForm)
Button1: TButton;
IH: TIdHTTP;
IdAntiFreeze1: TIdAntiFreeze;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
H: TIH;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
begin
Timer1.Enabled := True;
H := TIH.Create(' http://10.74.1.35/hp/device/this.LCDispatcher?nav=hp.Usage');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
H.FH.Socket.Close;
Timer1.Enabled := False;
end;
{ TIH }
constructor TIH.Create(URL: String);
begin
inherited Create(True);
FUrl := URL;
FreeOnTerminate := True;
Resume;
end;
procedure TIH.Execute;
begin
FH := TIdHTTP.Create(nil);
try
try
FH.Get(FURL);
except
ON E: Exception do MessageBox(0,PChar(E.Message),PChar(E.Message),MB_OK);
end;
finally
FH.Free;
end;
end;
end.
Оригинал (2008-04-17 19:18:00) [22]
> Palladin © (17.04.08 19:13) [123]
>
> > Оригинал (17.04.08 19:06) [122]
>
> пример в студию
Даже и примера нет необходимости приводить.
Закрывается сокет во время работы, обрабатывается исключение и всё.
ANB (2008-04-17 19:16:00) [23]
> В Indy TidHTTP позволяет прерывать получение данных с сервера.
Это умеет делать даже TWebBrowser
Palladin (2008-04-17 19:13:00) [24]
> Оригинал (17.04.08 19:06) [122]
пример в студию
Оригинал (2008-04-17 19:06:00) [25]
> Palladin © (17.04.08 18:40) [118]
>
> > Аврам (17.04.08 18:36) [116]
>
> это не поможет, get будет висеть пока не получит все данные
> по запросу.
В Indy TidHTTP позволяет прерывать получение данных с сервера.
Palladin (2008-04-17 19:05:00) [26]
> Аврам (17.04.08 18:46) [119]
ну это например....
Грегори Р. Эндрюс
Основы многопоточного, параллельного и распределенного программирования
http://www.ozon.ru/context/detail/id/1372271/
и конечно же Рихтера, Создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows
> Anatoly Podgoretsky © (17.04.08 18:51) [120]
:) дык, а я о чем...
Anatoly Podgoretsky (2008-04-17 18:51:00) [27]> Palladin (17.04.2008 18:37:57) [117]
Заказчика надо любить, я иногда даже грид не отрубаю при проходе по набору данных, пользователь видит, что идет работа, ему приятно, а для меня недорого.
Аврам (2008-04-17 18:46:00) [28]спасибо большое всем за ответы и советы, особенные благодарности Palladin.
могли бы вы мне посоветовать какие нить книги или матерьялы по теме потоков. хотелось бы основательно в этом разобраться чтобы понимать все как вы)
Palladin (2008-04-17 18:40:00) [29]
> Аврам (17.04.08 18:36) [116]
это не поможет, get будет висеть пока не получит все данные по запросу. работать нужно с сокетами на низком уровне, дабы иметь возможность по требованию монитора закрыть соединение и завершится. а здесь я тебе уже не помошник. проси слезно Сергея М., но он не будет таким "лапочкой" как я :)
Palladin (2008-04-17 18:37:00) [30]Да, кстати относительно визуализации процесса. Его вообще можно не визуализировать. Я, при написании примера распараллеливания, не ставил это главной задачей, как можно убедится глянув исходники, отказ от визуализации делается очень просто, выбрасыванием к чертям этого Synchronize и переносе исполнения функционала удаления отработанных данных в поток монитор. Только некоторые заказчики любят когда у них там строчечки появляются и исчезают :) типа "компьютер думает"...
Аврам (2008-04-17 18:36:00) [31]я так понимаю что будет самое то если вынести закачку странциы по запросу.
т.е. выглядеть будет так
типа page :=get(*******);
if posex(Param_result, page, 1) <> 0 then
begin
....парсинг результатов
в listview ставиться значения result
все остальные потоки вырубаются
end;
Palladin (2008-04-17 18:33:00) [32]Я? Я умываю руки и помогать уже не буду. Всем чем мог помог. Написал много букафф. Дело аффтара их переварить или выбросить в помойку.
ANB (2008-04-17 18:29:00) [33]
> Аврам (17.04.08 18:17) [113]
> во блин мужики, я сам офигел. вообще я доделываю начатую
> работу, только тот программер свалил. Я только щас выяснил
> что кол-во данных загруженных со страницы - разное при разных
> запросах к сайту.
> Когда обгаваривалось это вначале с заказчиком, то он посчитал
> что это не имеет значения. чисто случайно проверил. млин!
>
> я и думаю как то странно все получается. оказывается вся
> загвоздка в этих обращениях к сайту.
> получается что надо выносить скачку страницы с сайта в эти
> отдельные потоки чтоли...
Я бы самым первым попытался сделать запрос или группу их, чтобы минимизировать количество обращений к серверу.
Т.е. одним или несколькими запросами выкачать все на локал, а потом обрабатывать.
И только если время предварительной выкачки все равно будет занимать слишком много времени, начать работу по ускорению этого процесса. В том числе и за счет распараллеливания.
А гос. Palladin вам в этом поможет.
Аврам (2008-04-17 18:17:00) [34]во блин мужики, я сам офигел. вообще я доделываю начатую работу, только тот программер свалил. Я только щас выяснил что кол-во данных загруженных со страницы - разное при разных запросах к сайту.
Когда обгаваривалось это вначале с заказчиком, то он посчитал что это не имеет значения. чисто случайно проверил. млин!
я и думаю как то странно все получается. оказывается вся загвоздка в этих обращениях к сайту.
получается что надо выносить скачку страницы с сайта в эти отдельные потоки чтоли...
Palladin (2008-04-17 17:39:00) [35]
> ANB (17.04.08 17:37) [111]
и где ты взял столько много? процитировать меня процитировал, а вот на ссылаемые посты взглянуть не удосужился... ай ай ай...
ANB (2008-04-17 17:37:00) [36]
> Palladin © (17.04.08 17:16) [109]
> о... люди просыпаться начали... вкуривать в ветку... о количестве
> потоков я осведомился еще в [43] и [44] и не стоит думать
> что соединение до источника данных идеально... так что понизит
> или нет еще вопрос, траффик, да, скушает, но если грамотно
> подойти к вопросу получения информации из интернета, не
> используя компоненты высокого уровня, а работая на низком
> уровне сокетов, то можно рвать связь при необходимости..
> .
Боюсь, если автор начнет это реализовывать, то он из форума не вылезет.
Повышение скорости закачки из инета - это отдельная песня.
ЗЫ. Не думаю, что серверу, с которого качают данные, понравится 10 000 одновременных запросов с одного IP.
sniknik (2008-04-17 17:17:00) [37]> интернет давно появился, я уже запарился всем на это указывать...
его никто (из иначальных в этой ветке) и не игнорировал, но обсуждалось то не помещение части с инетом в поток, а распараллеливание части с "таинственной обработкой данных", которая по логике уже после/вместо/до/пофигу в общем когда но точно <> "закачке данных из инета".
Palladin (2008-04-17 17:16:00) [38]о... люди просыпаться начали... вкуривать в ветку... о количестве потоков я осведомился еще в [43] и [44] и не стоит думать что соединение до источника данных идеально... так что понизит или нет еще вопрос, траффик, да, скушает, но если грамотно подойти к вопросу получения информации из интернета, не используя компоненты высокого уровня, а работая на низком уровне сокетов, то можно рвать связь при необходимости...
sniknik (2008-04-17 17:11:00) [39]> Шустрые качалки этот процесс распараллеливают.
они это делают чтобы обойти ограничение сервера на скорость в одной сессии. т.е. если на сервере ограничивают скачку 100кб-тами, но поддерживают закачку частями, а у вас инет на 1мб, то понятно 10 потоков (до упора своего канала) со скоростью 100кб выкачают файл быстрее чем один на 100.
но вот если переборщить и качать например в 1000 потоков то это уже скорости не прибавит, наоборот понизит, + куча лишнего служебного трафика отожрет.
Palladin (2008-04-17 17:06:00) [40]
> Anatoly Podgoretsky © (17.04.08 16:55) [105]
с добрым утром... интернет давно появился, я уже запарился всем на это указывать...