Avatar billede morten_s Nybegynder
07. december 2001 - 11:32 Der er 11 kommentarer og
1 løsning

Indy til Terminalprogram



Er det muligt at få en IndyClient til at opføre sig som nonbloking ?

Jeg skal anvende den i et lille terminalprogram, og har brug for et OnRead event som skriver hvad der kommer ind i bufferen til et memokomponent.

Problemet i at køre bloking ligger i at jeg ikke ved hvilken slutkarrakter jeg har ?
Avatar billede martinlind Nybegynder
07. december 2001 - 11:40 #1
Det er jeg ikke sikker på, kan du ikke bruge borlands, den kan
Avatar billede morten_s Nybegynder
07. december 2001 - 12:31 #2
Mit problem med Borlands er at hvis jeg opretter den
runtime i en tråd, så kan jeg ikke få den til at Connecte :(
Avatar billede martinlind Nybegynder
07. december 2001 - 12:32 #3
Lyder da mærkeligt, hvad er fejlen ??
Avatar billede morten_s Nybegynder
07. december 2001 - 12:33 #4
Ingen, den connecter bare ikke når den sættes til det ClientSocket.Connect
Avatar billede martinlind Nybegynder
07. december 2001 - 12:38 #5
Har du prøvet med en TTCPClient den ligger også på Internet fanebladet

/MArtin
Avatar billede morten_s Nybegynder
07. december 2001 - 12:43 #6
Martin> Indys hjemmeside har du den adr ?
Avatar billede martinlind Nybegynder
07. december 2001 - 12:47 #7
Avatar billede cms Nybegynder
08. december 2001 - 15:20 #8
Det er i grunden meget simpelt. Du laver bare en thread, og i dennes OnExecute skriver du koden.
I dit program allokkerer du thread\'en ved at kalde dens Create, og vupti - har du en nonblocking tcpclient.
Avatar billede morten_s Nybegynder
08. december 2001 - 23:08 #9
cms> kan ikke lige se hvordan den bliver nonblocking af det
jeg kan jo stadigvæk kun læse med Indy\'ens Readln ??

Forklar lidt nærmere
Avatar billede cms Nybegynder
09. december 2001 - 22:25 #10
Okay.
Nonblocking betyder jo bare at vcl-threaden kan fortsætte med at køre, så derfor:

Først creater du threaden (fx ved tryk på en knap). Dit program fortsætter upåvirket af at threaden kører. Der er altså nu to threads i dit program, nemlig vcl-threaden (altså den hvor alt det visuelle i dit program foregår) og den thread du lige har oprettet (som vi vil bruge til at kalde IndyClient.Readln).
For hvis du i den threadclass du har oprettet skriver noget som dette:

procedure TMyIndyThread.Execute;
var
  FClient: TIdTCPClient;
  S: String;
  i: integer;
begin
  FClient := TIdTCPClient.create(nil);
  try
    FClient.Host := \'hej\';
    FClient.Connect;
    for i:=0 to 50 do
      S := FClient.ReadLn;
    Synchronize(CallFinished);
  finally
    FClient.free;
  end;
end;

procedure TMyIndyThread.CallFinished;
begin
  Form1.FinishedReading;
end;

Så vil dit program ikke hænge (være blocking), men fortsætte kørslen efter threaden er created. Når så threaden, som kører bagved det visuelle, er færdig med at reade sine data kalder den via synchronize metoden, inherited fra TThread, en metode/procedure i Form1. Den skal bare implementeres.
Værs\'go... En nonblocking TcpClient.
Avatar billede morten_s Nybegynder
09. december 2001 - 22:31 #11
Jeg tror du misforstår mig

Mit problem er at jeg mangler et OnreadEvent til
at læse hvad jeg har i min buffer, problemet er at jeg ikke
kender min aTerminator i Readln.
Min tråd står jo stille på readln indtil der kommer ATerminator
karakter/streng, men jeg har ikke en signifikant ATerminator

Det jeg spørger om er om det er  muligt at lave et readfrombuffer kald
når der er karraktere i bufferen
Avatar billede cms Nybegynder
11. december 2001 - 16:58 #12
undskyld, det står jo også i spørgsmålet... :-)
Men Indy\'s tcpclient har jo masser af procedurer til at reade uden at man kender en terminator.
ReadStream er genial. Der skal man kun kende størrelsen på bufferen, og den sender komponenten selv med, når den sender dataene.
ReadBuffer kan også sagtens bruges.
Men hvad vil du? Vil du kun modtage i 5 sekunder og så stoppe, eller kender du det sendte antal bytes?
I øvrigt kan man også sætte ReadStream til at læse indtil forbindelsen disconnectes...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester