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;

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

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


Оригинал   (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]

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


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

Наверх

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