Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2010, 17:16   #1
pure
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 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;
pure вне форума Ответить с цитированием
Старый 21.08.2010, 17:59   #2
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

мб попробовать TIdHTTP создать динамически в потоке?
Код:
var
 IdHTTP: TIdHTTP;
begin
 IdHttp := TIdHTTP.create(nil);
 idhttp.get('http://my.mail.ru/'+domain+'/'+login+'/');
 ...
 idhttp.free;
end;
kangreon вне форума Ответить с цитированием
Старый 21.08.2010, 18:27   #3
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

Цитата:
Сообщение от pure Посмотреть сообщение
как сделать так, чтобы потоки при работе с текстовым файлом распределили между собой строки, тем самым повышая производительность? а не обрабатывали все вместе одну и ту же. заранее благодарен
Использовать критические секции,
http://www.interface.ru/home.asp?artId=19789
Terikon вне форума Ответить с цитированием
Старый 21.08.2010, 19:30   #4
pure
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 10
По умолчанию

Цитата:
Сообщение от kangreon Посмотреть сообщение
мб попробовать TIdHTTP создать динамически в потоке?
Код:
var
 IdHTTP: TIdHTTP;
begin
 IdHttp := TIdHTTP.create(nil);
 idhttp.get('http://my.mail.ru/'+domain+'/'+login+'/');
 ...
 idhttp.free;
end;
попробовал, результат тот же... и даже скорость обработки всё равно не возросла
pure вне форума Ответить с цитированием
Старый 21.08.2010, 19:31   #5
pure
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Terikon Посмотреть сообщение
Использовать критические секции,
http://www.interface.ru/home.asp?artId=19789
я уже видел эту статью, но из неё не всё получилось понять... поэтому и обратился за помощью сюда. если бы поправили мой код (хотя бы отчасти), было бы замечательно
pure вне форума Ответить с цитированием
Старый 24.08.2010, 07:42   #6
fenix-elite
Пользователь
 
Аватар для fenix-elite
 
Регистрация: 02.11.2008
Сообщений: 75
По умолчанию

Цитата:
Сообщение от pure Посмотреть сообщение
попробовал, результат тот же... и даже скорость обработки всё равно не возросла
Такого быть не может. Если не создавать его в потоке, то все потоки будет использовать один компонент IdHTTP. Поставь хотя бы 10 потоков, и ты в этом убедишься
«Когда ты действительно чего-то хочешь, вся Вселенная помогает тебе осуществить твою мечту».(с) Пауло Коэльо
fenix-elite вне форума Ответить с цитированием
Старый 26.08.2010, 01:33   #7
pure
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 10
По умолчанию

мне на другом форуме ответили следующее...

Цитата:
У тебя поток обрабатывает 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 := TStringList.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;
но не всё понятно... а отвечать далее почему-то не хотят... поэтому задаю здесь...

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

Последний раз редактировалось pure; 26.08.2010 в 01:37.
pure вне форума Ответить с цитированием
Старый 26.08.2010, 02:14   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

FURL внутри Execute это ссылка текущего потока, то есть просто Http.Get(FURL)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.08.2010, 02:21   #9
pure
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
FURL внутри Execute это ссылка текущего потока, то есть просто Http.Get(FURL)
всё. понял, спасибо... а на счёт счётчика потоков, как верно его реализовать не подскажете?
pure вне форума Ответить с цитированием
Старый 27.08.2010, 00:45   #10
pure
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 10
По умолчанию

вот у меня в коде это делает переменная alive, но что-то я сомневаюсь, что она делает это корректно
pure вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность и с++ Koshmarovsky Visual C++ 13 06.09.2010 20:39
Многопоточность kroŧ Общие вопросы Delphi 5 21.06.2010 10:47
Многопоточность CrazyDude Общие вопросы Delphi 1 18.04.2010 19:00
Многопоточность Neymexa Помощь студентам 3 13.04.2010 11:43
Многопоточность IDHTTP KoBRaAndrey Работа с сетью в Delphi 6 30.11.2009 15:15