Newsgroups : Borland : borland.public.delphi.internet.winsock : 2006 Mar : 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.