Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Indy 10 - Adresse wird bereits verwendet

  Alt 9. Mär 2014, 10:47
Also erst mal sollte sich hier möglichst niemand prügeln weil sonst die nächsten Delphitage Maßnahmen bräuchten wie bisher Fußballspiele ...

Also ich nutze keine VCL-Controls und eine Synchronisation sollte nicht notwendig sein. Wenn es später komplexer wird will ich gemeinsame Zugriffe aber über critcal Sections schützen.

Ich verstehe das auch so, dass die Indy-Antwort in einem Thread kommt und Indy das kapselt. So ganz habe ich das allerdings noch nicht nachvollziehen können.
Eigentlich müsste dann die Zeile bei *1 vom Compiler ja in einen Thread gekapselt werden, was ich auch wieder nicht glauben kann.
Dafür würde es wohl eine Anweisung brauchen wie IdTCPClient1.IOHandler.ReadLnInString(S); damit ein Thread erzeugt und die Variable übergeben werden und der Mainthread weiter laufen könnte. Insofern glaube ich eher, dass der Timer eine längere Behandlung braucht und auf die Übertragung warten muss.

Daher denke ich auch nicht, dass ein weiterer Thread hilft oder das temp. Ausschalten des Timers (werde ich natürlich testen, komme ich aber erst später dazu).
M.E. feuert ein Timer ja anderseits auch nicht wenn er gerade noch läuft. Maximal sollte es so sein, dass ein Timer nach Beendigung "gleich wieder" feuert, aber zwischendrin bekommt ja der Mainthread m.E. erst mal wieder Zeit.

Es scheint so zu sein, dass Problem 1) nur entsteht, wenn mehrere Clients auf dem gleichen PC laufen.


Ich könnte mir folgendes als zweckmäßig vorstellen:

Delphi-Quellcode:
procedure TForm1Client.Timer1Timer(Sender: TObject);
begin
   Gui.sGuiNow := DateTimeToStr(Now);
   Inc(Gui.GuiCounter);
   Gui.sGuiCounter := IntToStr(Gui.GuiCounter);

  if NichtSchonEineAnFrageFürXXXLäuftUndDieLetzteAnfrageÄlterIstAlsEineHalbeSekunde then
  begin
     IdTCPClient1.Connect;
     try
       IdTCPClient1.IOHandler.WriteLn('@Now');
       Gui.sNow := IdTCPClient1.IOHandler.ReadLn(); // *1
     finally
       IdTCPClient1.Disconnect;
     end;
  end;

  if NichtSchonEineAnFrageFürXXXLäuftUndDieLetzteAnfrageÄlterIstAlsEineHalbeSekunde then
  begin
     IdTCPClient1.Connect;
     try
       IdTCPClient1.IOHandler.WriteLn('@Counter');
       Gui.sCounter := IdTCPClient1.IOHandler.ReadLn(); // *1
     finally
       IdTCPClient1.Disconnect;
     end;
  end;

  ...
end;

Ich bräuchte mal eine damit ich den rechten Weg finde...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 9. Mär 2014 um 10:53 Uhr)
  Mit Zitat antworten Zitat