Newsgroups : Borland : borland.public.delphi.internet.winsock : 2006 Mar : OnWork event handler not triggered ?...

www.cryer.info
Managed Newsgroup Archive

OnWork event handler not triggered ?...

Subject:OnWork event handler not triggered ?...
Posted by:"Adrien Reboisson" (adrien-reboissonatastasedotc..@desireless.com)
Date:2 Mar 2006 17:45:57

Hi

In a quite big project I used TIdTCPClient.OnWork event handler to update a progress bar. I dont know since when I noticed that the progress bar wasn't updated any more but today I decided to try to find the bug. After having spent some hours in my code without finding any apparent problem, I tried to check if internally Indy really called this event.

I discovered why my event was never called. In the following function :

procedure TIdComponent.DoWork(AWorkMode: TWorkMode; const ACount: Int64);
begin
  if FWorkTarget <> nil then begin
    FWorkTarget.DoWork(AWorkMode, ACount);
  end else begin
    if FWorkInfos[AWorkMode].Level > 0 then begin <-- never true !
      Inc(FWorkInfos[AWorkMode].Current, ACount);
      if Assigned(OnWork) then begin
        OnWork(Self, AWorkMode, FWorkInfos[AWorkMode].Current);
      end;
    end;
  end;
end;

...FWorkInfos[AWorkMode].Level is never greater than 0. As a result, OnWork is never called. Nevertheless, OnBeginWork is always called, as the OnEndWork event handler. But OnWork is never triggered.

I tried to reproduce this behaviour by dropping on a blank project a TIdTCPClient and an TIdTCPServer :

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  S: TFileStream;
begin
  S := TFileStream.Create('D:\test', fmCreate);
  try
    AContext.Connection.IOHandler.ReadStream(S);
  finally
    S.Free;
  end;
end;

procedure TForm1.IdTCPClient1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  Beep;
  //Never triggered !
end;

procedure TForm1.IdTCPClient1WorkBegin(ASender: TObject;
  AWorkMode: TWorkMode; AWorkCountMax: Integer);
begin
  Beep; //Okay
end;

procedure TForm1.IdTCPClient1WorkEnd(ASender: TObject;
  AWorkMode: TWorkMode);
begin
  Beep; //Okay
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: TFileStream;
begin
  with IdTCPClient1 do
  begin
    Connect;
    S := TFileStream.Create('D:\id.tif', fmOpenRead);
    try
      IOHandler.Write(S, 0, True);
    finally
      S.Free;
      Disconnect;
    end;
  end;
end;

Same result: OnWork is never called.

I don't know where is the problem. AFAIK my code worked with a
previous version of Indy. Is it a bug, an undocumented behaviour,
something I miss ?...

Thank you very much !

A.R.

Replies:

www.cryer.info
Managed Newsgroup Archive