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...