Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.08.2010, 15:42
srubill srubill вне форума
Прохожий
 
Регистрация: 21.08.2010
Сообщения: 2
Репутация: 10
По умолчанию idHTTP.Get и многопоточность

есть программа, которая берёт строку из текстового файла и на основе её переходит по ссылке IdHTTP.Get. пытаюсь реализовать многопоточность, но никак не выходит почему-то потоки (сколько бы я их не задавал) за секунду убиваются до 1... и ещё другая проблема, как сделать так, чтобы потоки при работе с текстовым файлом распределили между собой строки, тем самым повышая производительность? а не обрабатывали все вместе одну и ту же. заранее благодарен

вот код юнита с потоком:

Код:
type
  TMyThread = class(TThread)
    private
      s,smod:string;
      i:integer;
    protected
    procedure ShowResult;
    procedure ThreadExit(Sender : TObject);
    procedure Execute; override;
    public
      constructor Create; overload;

constructor TMyThread.Create;
begin
   Create(true);
   Inc(alive);
   Priority:=tpHigher;
   OnTerminate:=ThreadExit;
   Resume;
end;

procedure TMyThread.ThreadExit(Sender: TObject);
begin
  dec(alive);
end;

procedure TMyThread.Execute;
begin
  assignfile(f,path);
  reset(f);
  assignfile(f1,extractfilepath(path)+'1.txt');
  rewrite(f1);
  repeat
  while not eof(f) do
  begin
    readln(f,s);
    login:=copy(s,1,pos('@',s)-1);
    domain:=copy(s,pos('@',s)+1,length(s));
    delete(domain,pos('.',domain),3);
    code:=Form1.IdHTTP1.Get('http://my.mail.ru/'+domain+'/'+login+'/');
    //опущу часть кода
    Synchronize(ShowResult);
  end;
  until Terminated;
  closefile(f);
  closefile(f1);
  for tr:=0 to n-1 do
  begin
    MyThread[i].Terminate;
    Synchronize(ShowResult);
  end;
end;

и вот код главного юнита:

Код:
var
  alive,n,q:integer;
  MyThread:array of TMyThread;

procedure TForm1.Button1Click(Sender: TObject);
begin
  n:=10;
  setlength(mythread,n);
  for q:=0 to n-1 do
    MyThread[q]:=TMyThread.Create;
end;
Ответить с цитированием
  #2  
Старый 21.08.2010, 21:11
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,204
Версия Delphi: 7, XE3, 10.2
Репутация: 49086
По умолчанию

Потому что делается это не так.
У тебя поток обрабатывает 1 ссылку.
Соответсвенно, тебе надо эту ссылку потоку передавать извне.

Код:
// Поток
type 
  TMyThread = class(TThread)
  private
    FURL : String;
  ...
  public
    constructor Create(CreateSuspended : Boolean; AURL : String);
  ...

constructor TMyThread.Create(CreateSuspended : Boolean; AURL : String);
begin
  inherited Create(CreateSuspended);
  FURL := AURL;
  ...
end;

// Вызов потоков
procedure TForm1.Button1Click(Sender: TObject);
var
  I : Integer;
  L : TStringList;
  A : Array Of TMyThread;
begin
  L := TStreingList.Create;
  L.LoadFromFile('urls.txt');
  SetLength(A,L.Count);
  For I := 0 To L.count-1 Do
    A[i]:=TMyThread.Create(False,L[i]);
  L.Free;
end;
Ответить с цитированием
  #3  
Старый 21.08.2010, 23:56
srubill srubill вне форума
Прохожий
 
Регистрация: 21.08.2010
Сообщения: 2
Репутация: 10
По умолчанию

с этим кодом я почти разобрался... вот только не пойму как переписать мой Execute для такого...(

и если оставить организацию счётчика активных потоков в переменной alive (как у меня) будет ли она верно их показывать? или стоит что-то переделать тоже?

Последний раз редактировалось srubill, 22.08.2010 в 00:06.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2018

ВКонтакте   Facebook   Twitter