Newsgroup: it.comp.lang.delphi
Titolo: Altri problemi di visibilità

Ehm, scusatemi, ma non riesco mica a venir a capo di questo problema...
Avendo una classe strutturata cosě, perchč se metto un breakpoint nel ciclo
del thread, mi esegue il ciclo solo una volta?
unit Fserve;
interface
uses Classes, IdTcpClient, Windows;
type
    TThreadSocket = class(TThread)
     FCmd : String;
     FSocket : TIdTcpClient;
     FOnBuffer : TNotifyEvent;
     public
      procedure Execute; override;
      procedure UpdateForm();
    end;
    TFServe = class
     FSocket : TIdTcpClient;
     FThread : TThreadSocket;
     FCmd : String;
     FOnBuffer : TNotifyEvent;
      constructor Create();
      property Buffer : String read FCmd;
      property OnBuffer : TNotifyEvent read FOnBuffer write FOnBuffer;
    end;
implementation
{ TThreadSocket }
procedure TThreadSocket.Execute;
begin
     Sleep(50);
     while FSocket.Connected do
     begin
     FCmd := FSocket.ReadLn();
     if Assigned(FOnBuffer) then
         FOnBuffer(Self);
//     Synchronize(UpdateForm);
     end;
end;
procedure TThreadSocket.UpdateForm;
begin
end;
{ TFServe }
constructor TFServe.Create;
begin
   inherited;
   FSocket := TIdTcpClient.Create(nil);
   FThread := TThreadSocket.Create(True);
   FThread.FSocket := FSocket;
   FCmd := FThread.FCmd;
   FThread.FOnBuffer := FOnBuffer;
   FThread.Resume;
end;
end.
Nella form la classe la uso cosě
procedure TForm1.Buffer(Sender : TObject);
begin
RichEdit1.Lines.Add(x.Buffer);
end;
procedure TForm1.Button1Click(Sender: TObject);
var x : TMyFServe;
begin
x := TFServe.Create();
x.FSocket.Host := '
irc.edencom.it
';
x.FSocket.Port := 6667;
x.FSocket.Connect();
x.OnBuffer := Buffer;
end;

 breakpoint nel ciclo del thread, mi esegue il ciclo solo una volta?
[cut]
Forse perche' il socket si sconnette?
-- 
I'am what I'am, I do what I can

 del thread, mi esegue il ciclo solo una volta?
Eseguendo un Debug all'interno del metodo Execute, se ci fai caso, ti
accorgerai che *non* viene eseguito il ciclo soltanto una volta, ma
manco quello! Si *pianta* all'interno del metodo FSocket.ReadLn;. Il
*cursore del debugger non ritorna*. Esso rimane bloccato all'interno di tale
metodo.
Non ho mai usato gli Indy ma una domanda sorge spontanea. Non è che per caso
devi settare qualche altra proprietà del componente?
--
Acqua
-------------------------------------------------------
Download new version of my PixExperts for Delphi 6/C++ Builder 6 at
http://www.salexander.supereva.it/Pix_Exp171D6.zip

No no, lo esegue il ReadLn, ne sono sicuro, solo che una volta uscito dal
Thread non ci ritorna più dentro non so perchè...
Questo codice invece funziona egregiamente, è più o meno lo stesso, solo che
non è stato inserito in una classe.
unit uFserveThread;
interface
uses
Classes, Windows;
type
TFserveThread = class(TThread)
cmd : String;
procedure UpdateForm;
procedure Execute; override;
end;
implementation
uses uFserve;
{ Important: Methods and properties of objects in visual components can only
be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TFserveThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TFserveThread }
procedure TFserveThread.UpdateForm;
begin
// Questa è la fase in cui il Client se connesso continua a leggere
// quello che riceve
frmfserve.rch_FServe.Lines.Add(cmd);
// Parse del messaggio per vedere cosa contiene
frmfserve.ParseCmd(cmd);
end;
procedure TFserveThread.Execute;
begin
Sleep(50);
while frmfserve.FServe1.Connected do
begin
cmd := frmfserve.FServe1.ReadLn();
Synchronize(UpdateForm);
end;
end;
end.

 dal Thread non ci ritorna piy dentro non so perchh...
[cut]
Ma hai letto l'help in linea di Delphi riguardo ai thread?
Una volta che un thread completa il suo metodo Execute, e richiama
l'evento OnTerminate, a seconda del parametro passato alla costruzione
o resta in attesa o si distrugge.


Aspettate, allora il thread funziona, il dato viene letto, solo che non
riesco a leggere poi la variabile FCmd, e non riesco ad assegnare l'evento
OnBuffer.
Perchč facendo cosě non reisco a far scattare l'evento OnBuffer?
Inoltre, la variabile FCmd, mi ritorna sempre vuota...
unit Fserve;
interface
uses Classes, IdTcpClient, Windows;



implementation
{ TThreadSocket }
procedure TThreadSocket.Execute;
begin
     Sleep(50);

     end;
