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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.02.2016, 11:49
Stanei Stanei вне форума
Новичок
 
Регистрация: 21.05.2015
Сообщения: 55
Версия Delphi: Rad Studio 10
Репутация: 10
По умолчанию Как остановить idhttp

Добрый день.

При клике на кнопку запускается поток, в котором только
Код:
html:=idhttp1.get(site); //html, site - стринговые, глобальные

Но, допустим на форме 10 кнопок, каждая задаёт переменной "site" определённый текст(ссыль).

Вопрос вот в чём, как правильно остановить запрос idhttp и закрыть сокеты если при клике idhtpp1 уже пытается что-то загрузить? Что бы можно было хоть 500 раз кликать на кнопку, но результат всё равно придёт?
Ответить с цитированием
  #2  
Старый 11.02.2016, 12:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Disconnect не работает?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 11.02.2016, 12:40
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Проверяйте контекст запроса на повтор перед отправкой. Управлять сервером - т.е. отказаться от посланного запроса вы не сможете.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 13.02.2016, 10:25
Stanei Stanei вне форума
Новичок
 
Регистрация: 21.05.2015
Сообщения: 55
Версия Delphi: Rad Studio 10
Репутация: 10
По умолчанию

В общем почитав про инди, набросал вот это:

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, idhttp;

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

  type pot=class(tthread)
    private
    public
    procedure execute; override;
  end;

var
  Form1: TForm1;
  id:Tidhttp;
  p:pot;

implementation

{$R *.dfm}

procedure pot.Execute;
var
s:string;
begin
if p.Terminated=false then s:=id.Get('http://.ru/');
if p.Terminated=false then id.Free;
if p.Terminated=false then id:=nil;
if p.Terminated=false then form1.Memo1.Lines.Add('готово');
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Memo1.Lines.Add('Старт');

if id<>nil then
begin
p.Terminate;
id.Socket.Close;
id.Free;
id:=nil;
end;

id:=Tidhttp.Create(nil);
p:=pot.Create(true);
p.FreeOnTerminate:=true;
p.Priority:=tpnormal;
p.Resume;
end;

end.

Этот код будет работать стабильно, или нужно что то добавить/исправить? Что бы не получилось такого, что после часа пользования программой она прикажет долго жить?
Ответить с цитированием
  #5  
Старый 13.02.2016, 16:55
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Этот код лучше не использовать.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 13.02.2016, 18:17
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
По умолчанию

Цитата:
Сообщение от Stanei
В общем почитав про инди, набросал вот это:

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, idhttp;

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

  type pot=class(tthread)
    private
    public
    procedure execute; override;
  end;

var
  Form1: TForm1;
  id:Tidhttp;
  p:pot;

implementation

{$R *.dfm}

procedure pot.Execute;
var
s:string;
begin
if p.Terminated=false then s:=id.Get('http://.ru/');
if p.Terminated=false then id.Free;
if p.Terminated=false then id:=nil;
if p.Terminated=false then form1.Memo1.Lines.Add('готово');
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Memo1.Lines.Add('Старт');

if id<>nil then
begin
p.Terminate;
id.Socket.Close;
id.Free;
id:=nil;
end;

id:=Tidhttp.Create(nil);
p:=pot.Create(true);
p.FreeOnTerminate:=true;
p.Priority:=tpnormal;
p.Resume;
end;

end.

Этот код будет работать стабильно, или нужно что то добавить/исправить? Что бы не получилось такого, что после часа пользования программой она прикажет долго жить?

Ну хотя бы закодить корректно, например, часть того что ты накалякал будет выглядеть намного проще так:

Код:
procedure pot.Execute;
var
s:string;
begin
if not p.Terminated then 
begin
try
s:=id.Get('http://.ru/');
id.Disconnect;
finally
FreeAndNil(id);
end;
form1.Memo1.Lines.Add('готово');
end;
end;

Зы, в тырнете куча примеров правильной многопоточки...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter