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


Автор: Zlo 6.11.2006, 18:50
Собственно нужно по событию OnWork компоненты idHTTP1 рвать соединение.
Сделал вот так, но не работает, почему не могу понять:
Код

unit Unit2;
interface
uses
  Classes, SysUtils,IdHTTP, StdCtrls, IdComponent, IdTCPConnection, IdTCPClient,IdCookieManager;
type
  TPMSender = class(TThread)
  idHTTP1:TidHTTP;
  procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
    const AWorkCount: Integer);
  private
    { Private declarations }
    FForumUrl:String;
    FUserList:String;
    FPMmessage:String;
    FForumLogin:string;
    FForumPassword:string;
    FMsgTitle:string;
    Rezyltat:String;
  protected
    procedure Execute; override;
    procedure ShowResult;
    procedure OnTime;
    procedure OffTime;
    procedure IncUser;
    procedure ShowResult2;
  public
    property ForumUrl: string write FForumUrl;
    property UserList: string write FUserList;
    property PMmessage: string write FPMmessage;
    property ForumLogin: string write FForumLogin;
    property ForumPassword: string write FForumPassword;
    property MsgTitle: string write FMsgTitle;
  end;
implementation
uses Unit1;
{$J+}
const
   DataHtmlRead:Boolean=true;
var
    auth_key,post_key:String;
    
procedure TPMSender.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
    if DataHtmlRead= false then
       if AWorkMode=wmRead then idHTTP1.DisconnectSocket;
end;
procedure TPMSender.Execute;
var
  {...}
begin
  {...}
end;

Тов. Matematik сказал что нужно установить событие, но как и где что нужно дописать я не понимаю. Подскажите плиз!

Автор: Romikgy 6.11.2006, 21:14
Цитата(Zlo @  6.11.2006,  17:50 Найти цитируемый пост)
DataHtmlRead:=false;

имхо это надо не в потоке делать , а в главной программе

Автор: Zlo 6.11.2006, 22:12
Romikgy, 
Цитата(Romikgy @  6.11.2006,  21:14 Найти цитируемый пост)
имхо это надо не в потоке делать , а в главной программе 

не- не это тут просто переменная!
Ну неужели никто не может помоч?!

Автор: Romikgy 6.11.2006, 22:44
но с помощью ее ты стопоришь прием!
Цитата(Zlo @  6.11.2006,  17:50 Найти цитируемый пост)
procedure TPMSender.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
    if DataHtmlRead= false then
       if AWorkMode=wmRead then idHTTP1.DisconnectSocket;
end;

сделай эту переменую членом главной формы, и проверяй ее 

Автор: Zlo 6.11.2006, 23:34
Romikgy
Цитата(Romikgy @  6.11.2006,  22:44 Найти цитируемый пост)
но с помощью ее ты стопоришь прием!

Дык так и задумано! Тока почему-то не стопорится! И как сделать чтоб работало????

Автор: Quadr0 7.11.2006, 00:25
...

Автор: Zlo 7.11.2006, 00:50
Цитата(Quadr0 @  7.11.2006,  00:25 Найти цитируемый пост)
Собсно ничего не даст. Ну закрылось соединение, а работа потока-то продолжается.

Так и задумано, а не работает то что не стопорится  прием дынных!
Мне не надо убивать поток, поток должен прожолжать работу!

Автор: Quadr0 7.11.2006, 12:45
...

Автор: Matematik 7.11.2006, 13:18
Код

  TThread2 = class(TThread)
  private
    procedure WorkEventProc(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
  end;
{...}
procedure TThread2 .WorkEventProc(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
// если сделать Terminate, Disconnect вызовет исключение в методе Get, попадем в try Except
  if Terminated then
    (Sender as TIdHTTP).Disconnect;
end;
procedure TThreadHTTP.Execute;
var  FIdHTTP : TIdHTTP;
begin
  FIdHTTP := TIdHTTP.Create(nil);
  try
    FIdHTTP.OnWork := WorkEventProc; // УСТАНОВКА СОБЫТИЯ
    {...}
     try
       FIdHTTP.Get('большой файл');
     except
       if Terminated then
       begin
         // поток решили остановить
       end
         else
       begin
         // ошибка
       end
     end
    {...} 
  finally
    FIdHTTP.Free;
  end
end;

Автор: dumb 7.11.2006, 14:13
Цитата(Quadr0 @  7.11.2006,  12:45 Найти цитируемый пост)
DataHtmlRead у тебя - константа! И всегда во время выполнения программы равна True.

если мне не изменяет мой склероз, это называется "типизированной константой" и является, по-сути, переменной с начальным значением, которая, в отличие от обычных, лежит в сегменте data.

Автор: Quadr0 7.11.2006, 14:21
...

Автор: dumb 7.11.2006, 14:38
Quadr0, я указал на твое ошибочное высказывание(неоднократное). и все. smile

Автор: Quadr0 7.11.2006, 15:48
...

Автор: Zlo 7.11.2006, 20:35
типизированная константа меняет свое значение в ходе работы программы! 
Matematik,  а незя вместо
Код

if Terminated then
    (Sender as TIdHTTP).Disconnect;

написать
Код

if AWorkMode=wmRead then idHTTP1.DisconnectSocket;

????

Автор: Matematik 7.11.2006, 20:51
Пиши, обрабатывай Exception.
smile

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