[ anon68680 @ 02.09.2008. 19:09 ] @
problem je u TConnection.ClientOnRaw... nista sto se nalazi unutar ove procedure se ne odvija?

Evo koda:

Code:

program Project1;

uses
 IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdIRC,dialogs,sysutils;

  type
   TConnection = class(TObject)
   Client: TIdIRC;
   procedure ClientOnRaw(Sender: TObject; AUser: TIdIRCUser; ACommand,
  AContent: String; var Suppress: Boolean);
   private
   public
   constructor Create;
   destructor Destroy; override;
  end;

 var
 con: TConnection;
 f:integer;

procedure TConnection.ClientOnRaw(Sender: TObject; AUser: TIdIRCUser; ACommand,
  AContent: String; var Suppress: Boolean);
begin
ShowMessage('aaaa');
end;

constructor TConnection.Create;
begin
   Client:=TIdIRC.Create(nil);
   Client.Port:=6667;
   client.host:='irc.kravakazemoo.com';
   Randomize;
   Client.Nick:='krava';
   Client.Password:='muuuu';
   Client.OnRaw:=Self.ClientOnRaw;
   Client.Username:='mesokombinat';
   Client.RealName:= 'Belka';
end;

destructor TConnection.Destroy;
begin
  inherited;
  Client.FRee;
end;

begin
  con:=TConnection.Create; 
  con.Client.Connect;
  f:=0;
  repeat
  sleep(0);
  until
  f=1;
end.



[ obucina @ 02.09.2008. 22:00 ] @
Asinhroni I/O za Windows sokete, koje Indy verovatno koristi, radi pomocu Windows poruka, tj zahteva red poruka (Message Queue), tj zahteva glavni prozor u programu. Moras imati glavni prozor aplikacije. U slucaju da u asinhronom modu koristi Event objekte ili koristi sinhrone sokete, tj da ne zahteva glavni prozor, ClientOnRaw ne moze da se izvrsi, jer ti se program vrti u beskonacnoj petlji. Ovakva postavka programa je potpuno pogresna.

[Ovu poruku je menjao obucina dana 02.09.2008. u 23:11 GMT+1]
[ anon68680 @ 02.09.2008. 22:09 ] @
Interesantno je to sto kad se unutar procedure npr nalazi nesto tipa:

cmd:=acontent; gde je cmd neka globalna string varijabla, ono se toj varijabli i dodeli odgovarajuca vrednost a ja je mogu ocitati kroz onu glavnu petlju u nekom slucaju. Kako da resim ovo a da ne moram da imam prozor u aplikaciji? Poenta je u tome da izbegavam Forms unit jer pokusavam da napravim sto manju aplikaciju.
[ obucina @ 02.09.2008. 22:15 ] @
Citat:
krza:Kako da resim ovo a da ne moram da imam prozor u aplikaciji?

Nemoj koristiti Indy komponente i uradi sve u Windows API-ju ili probaj da nadjes neku drugu socket komponentu.
[ savkic @ 03.09.2008. 01:32 ] @
> Asinhroni I/O za Windows sokete, koje Indy verovatno koristi, radi pomocu Windows poruka, tj zahteva red poruka (Message Queue), tj
> Nemoj koristiti Indy komponente i uradi sve u Windows API-ju ili probaj da nadjes neku drugu socket komponentu.

Indy komponente su baš poznate po tome što su blokirajuće tj. sinhrone, u asinhrone spada npr ICS.
Inače moja preporuka je da koristi Indy, a što se tiče problema ne okidanja event handlera, prosto greši negde, a gde barem ja ne mogu reći na osnovu dostupnih informacija, moj savet je da proveri da li taj event uopšte treba da se poziva i da je najbolje krenuti od zvaničnog demo primera.
[ nikomak @ 03.09.2008. 06:52 ] @
Pozdrav,

Koja je ovo verzija Indy-a ? Indy 9 mozda, posto je kod mene deklaracija onraw evt totalna drugacija na Indy 10 komponenti.
Sto se tice procesiranja poruka (ako je ono uopste potrebno :), moze se koristiti "nevidljivi" TPUtilWindow

Code:

...
FHandle: THandle;
procedure WndProc(var Msg: TMessage); 
...
//negde u constructor-u
FHandle := AllocateHwnd(WndProc);
...
procedure WndProc(var Msg: TMessage); 
begin
 //ovde handle-ovanje msg od interesa i defwndproc za sve ostale
 DefWindowProc(FHandle,Msg.Msg,Msg.WParam,Msg.LParam)
end;
...
//kasnije u destruktoru, ili gde vec
DeAllocateHWnd(FHandle);


Edit:
Jos jedno pitanje, je li ovo konzolna aplikacija ?

[Ovu poruku je menjao nikomak dana 03.09.2008. u 08:03 GMT+1]
[ 0rc @ 04.09.2008. 22:13 ] @
U verziji koju ja trenutno koristim, TIdIRC startuje TIdIRCReadThread koji, koliko mogu da vidim na brzinu, prima podatke sa socketa i preko Synchronize() poziva obavestava deo komponente koji se izvrsava u kontekstu glavnog threada.
Synchronize() ne radi bez message loop-a, dakle, nije dostupan u konzolnim aplikacijama: http://coding.derkeiler.com/Ar...objectpascal/2003-12/0107.html .

A meni izgleda kao konzolna aplikacija.. U svakom slucaju nema message loop-a izmedju begin i end. :)

Indy je kvazi-sinhroni posto uglavnom ne blokira direktno thread u kojem se izvrsava na pravim I/O pozivima nego koristi skarabudzevine kao sto je ova ovde. Mogu da ti preporucim Synapse (http://synapse.ararat.cz/), ali on nema IRC klijent...