Indy+ http + thread

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Indy+ http + thread

Сообщение der_win » 24.02.2011 16:50:21

Суть задачи такая:
нужно сделать get-запрос, а результат сохранить в файл.

А проблема такая:
если делать всё в главной форме - всё работает. Если я процедуру получения страницы запихиваю в отдельный поток - программа крашится, ссылаясь на строку в модуле IdHTTP:
Код: Выделить всё
DoRequest(Id_HTTPMethodGet, AURL, nil, AResponseContent, AIgnoreReplies);

Если запускать программу без отладки и попытаться работать с файлом - то будет сообщание что "файл используется". И его размер при этом 0.

Компилятор лазарь, последний на сегодня релиз.
Код программы примерно такой:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, IdHTTP, IdAuthentication;

type

  { TUpdateThread }
  TUpdateThread = class(TThread)
   IdHTTP1: TIdHTTP;
  protected
    procedure Execute; override;
    procedure Get();
  end;

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  myfile: textfile;
    updater:TUpdateThread;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin

  updater:=TUpdateThread.Create(True);
  updater.FreeOnTerminate:=True;
  updater.Resume;

end;

procedure TUpdateThread.Execute;
begin
  Get();
end;

procedure TUpdateThread.Get();
var s:string;
begin
  s:= idHTTP1.Get('http://ya.ru');
  assignfile(myfile, 'upd.xml');
  rewrite(myfile);
  Write(myFile, s);
  closefile(myfile);
end;


initialization
  {$I Unit1.lrs}

end.



Подскажите где косяк....
der_win
новенький
 
Сообщения: 19
Зарегистрирован: 10.02.2011 18:44:18

Re: Indy+ http + thread

Сообщение Vadim » 24.02.2011 18:13:26

der_win
Попробуйте так:
Код: Выделить всё
procedure TUpdateThread.Get();
var s: TStringList;
begin
  s:=TStringList.Create;
  s.Text:= idHTTP1.Get('http://ya.ru');
  If s.Count>0 Then
    s.SaveToFile('upd.xml');
  s.Free;
end;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Indy+ http + thread

Сообщение der_win » 24.02.2011 18:49:21

спасибо за подсказку :) натолкнули на правильное решение....
тут я сам виноват, нужно использовать
Код: Выделить всё
IdHTTP1 := TIdHTTP.Create(nil);   

Как я понимаю - если компонент добавлен через графический интерфейс, то все его составляющие сами прописываются. Тут же придётся инициализировать вручную....
der_win
новенький
 
Сообщения: 19
Зарегистрирован: 10.02.2011 18:44:18

Re: Indy+ http + thread

Сообщение Vadim » 24.02.2011 19:30:41

der_win писал(а):Тут же придётся инициализировать вручную....

Да, лучше всего будет создавать компонент внутри потока, чтобы он был только там и никак не выходил за пределы...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38

Рейтинг@Mail.ru