Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как получить доступ к методу потока(TThread) из ос


Автор: Pcrepair 30.3.2013, 08:49
Добрый день. Есть код
Основной поток:

Код

unit uMain;
interface
uses
  ........

type
   .......

var
  Main: TMain;

implementation
uses uLoader;
{$R *.dfm}

(*Запуск Потока загрузки страницы*)
procedure TMain.Button1Click(Sender: TObject);
var ThreadLoder: TLoader;
begin
  ThreadLoder:=Tloader.Create(Edit1.Text);
end;

(*Принудительная остановка процесса загрузки*)
procedure TMain.Button2Click(Sender: TObject);
begin
  //вот тут непонятно, как вызвать метод AbortConnection из запущенного потока  
end;


Поток загрузчика:

Код

unit uLoader;
interface
uses
  Classes, idHTTP, SysUtils, Dialogs,Windows;

type
  TLoader = class(TThread) 
  private
     FUrl:string; 
     FHtml:string;
     FIdHttp:TidHTTP;

  protected
    procedure Execute; override; 
    function LoadHtmlPage(const Url:string):string;
  public
    constructor Create(AStr:string);
    destructor Destroy; override;
    procedure AbortConnection;
  end;

implementation

constructor TLoader.Create(AStr:string);
begin
  inherited Create(False);         (*Поток создаем в состоянии ЗАПУСК*)
  FIdHttp := TIdHTTP.Create(nil);  (*тут же создаем загрузчик*)
  FreeOnTerminate := True;         (* Поток освободит ресурсы при окончании работы*)
  Priority := tpNormal;
  FUrl:=AStr;
end;

destructor TLoader.Destroy;
begin
  FreeAndNil(FIdHttp);
  inherited Destroy; 
end;

(*принудительное отключение TidHttp*)
procedure TLoader.AbortConnection;
begin
 if Assigned(FIdHttp) then  (*если загрузчик запущен*)
 begin
   FIdHttp.Socket.Close;
 end;
end;

function TLoader.LoadHtmlPage(const Url:string):string;
begin
 try
   Result:=FIdHttp.Get(Url);
 except
   Exit;
 end;
end;

procedure TLoader.Execute;
begin
   FHtml:=LoadHtmlPage(FUrl);
end;

end.


Вопрос: как вызвать AbortConnection из основного потока, для принудительного завершения работы TidHttp?

Автор: Illusion Dolphin 30.3.2013, 09:54
Цитата

  //вот тут непонятно, как вызвать метод AbortConnection из запущенного потока  

Надо сделать чтобы поток был FreeOnTerminate := Fase; и хранить на него ссылку и через ссылку вызывать метод. Для освобождения ресурсов можно сделать Call-Back по окончанию работы потока и там уничтожать объект и обнулять ссылку.

Автор: Pcrepair 30.3.2013, 13:48
все понятно, всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)