Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Socket-Verbindung herstellen ohne zu blockieren (https://www.delphipraxis.net/196288-socket-verbindung-herstellen-ohne-zu-blockieren.html)

Medium 8. Mai 2018 09:34

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Genau das ist der Plan. Siehe weiter oben ;)

TiGü 8. Mai 2018 10:18

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Zitat:

Zitat von Medium (Beitrag 1401667)
Genau das ist der Plan. Siehe weiter oben ;)

Do it! :thumb:

ensaron 8. Mai 2018 10:31

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Zitat:

Zitat von Medium (Beitrag 1401660)
Bzgl. ICS: Danke für den Tipp! Für dieses Projekt im speziellen würde ich solch einen großen Umbau gern tunlichst vermeiden, aber für die Zukunft schau ich mir das definitiv mal an. Kurze Nachfrage: Wo liegt der Vorteil zu den Indys (mit denen ich für neue Projekte auch schon geliebäugelt hatte)?

In den Projekten, wo ich die ICS Komponenten einsetze, liegt der Vorteil für mich vor allem in der asynchronen Ausführung. Man kommt einfach zu jedem Zeitpunkt an die Komponente heran und kann auch mal bei Bedarf einen Verbindungsaufbau oder -trennung oder eine Abfrage von Daten einfach abbrechen ohne auf einen Timeout in der Komponente warten zu müssen.

Medium 8. Mai 2018 15:32

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Danke für die Infos!

Ich habe hier jetzt leider ein großes Problem: Mein Socket im Thread will sich nicht verbinden, aber ein TClientSocket, der als Komponente auf meinem Formular liegt und exakt dieselben Settings hat kann dies ohne Probleme. Hier mal mein Thread:

Delphi-Quellcode:
constructor TSocketProbeThread.Create(aSocket: TClientSocket; aPauseTime: Integer);
begin
  inherited Create(false);
  FIP := aSocket.Host;
  FPort := aSocket.Port;
  FPauseTime := aPauseTime;
  FCS := TCriticalSection.Create;
end;

procedure TSocketProbeThread.Execute;
begin
  inherited;
  repeat
    FCS.Enter;
    try
      if not Assigned(FSocket) then
      begin
        FSocket := TClientSocket.Create(nil);
        FSocket.OnError := SocketError;
        FSocket.Host := FIP;
        FSocket.Port := FPort;
        FSocket.ClientType := ctNonBlocking;
      end;
      if (not FSocket.Active) then
      begin
        try
          FSocket.Active := true;
        except;
          Sleep(100);
        end;
      end;
    finally
      FCS.Leave;
    end;
    Sleep(FPauseTime);
  until Terminated;
end;
(Das Sleep(100) im except-Zweig ist nur für mich zum Haltepunkt setzen.)

Das Programm läuft ohne jeden Fehler zu generieren "FSocket.Active := true;" durch, aber .Active ist danach weiterhin false. Es wird weder der Except-Zweig betreten, noch wird OnError ausgelöst, und der Thread wird auch nicht weggeschossen. Er läuft brav weiter und versucht im gesetzten Intervall (10s im Moment) Active zu setzen, aber es bleibt einfach immer false. Ohne Fehler ohne alles.

Nehme ich den Socket, den ich im Create als Datenspender übergebe, welcher auf meinem Formular liegt, verbindet dieser sich sofort und ohne Probleme. Was mache ich hier falsch jetzt?

TiGü 8. Mai 2018 15:46

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Landet der Debugger bis in TCustomWinSocket.Open und darin in procedure TCustomWinSocket.DoOpen bzw. TCustomWinSocket.AsyncInitSocket? Oder kommst du da schon gar nicht hin?

Medium 8. Mai 2018 15:53

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Leider springt der Debugger erst gar nicht in die Zuweisung (F7), und Breakpoints in der Unit ScktComp werden mir deaktiviert. Das schmälert meine Möglichkeiten schon recht arg ein :(

Medium 8. Mai 2018 17:28

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Ich habe jetzt mal versucht, wie hier und da empfohlen, die scktcomp.dcu zu löschen (bzw. umzubenennen, ich bin ja vorsichtig). Leider meldet mir dann der Compiler, dass ihm diese Datei dann fehlt. Diese selbst mal zu kompilieren, auf die Idee kommt er nicht, obwohl der Pfad sowohl im Such- als auch Bibliothekspfad eingestellt ist.

Dann habe ich mal versucht dclusr neu zu kompilieren, alle 3 Projektdateien die es in dem lib-Ordner mit diesem Namen gibt. Alle 3 zeigen unter "Enthält" nichts. Kompilieren bringt auch nichts. Dann habe ich ein eigenes Package erstellt und die scktcomp.pas hinzugefügt, und da sagte man mir dann, dass diese bereits in "rtl" vorhanden sei. Ich finde aber kein zugehöriges Package, das ich mal kompilieren könnte. Die .pas alleine kompiliert auch nicht.

Wie zum Henker erstelle ich denn nun mal neue DCUs!? (In der Hoffnung, dass es "nur" daran lag.)

Medium 8. Mai 2018 17:42

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Ein letzter Eintrag: Gelöst!!

ich habe einfach mal die scktcomp.pas in mein Projektverzeichnis kopiert, und siehe da: SO kann ich darin auch debuggen. Und was habe ich herausgefunden? Im Thread muss der Socket blocking sein! Ich weiß nicht warum, weil mein VCL-Thread ist ja am Ende auch nur ein Thread und da geht's nonBlocking, aber egal. Ich bin einfach nur froh, langsam mal über Mittagessen nachdenken zu können!

Cheers!

blawen 9. Mai 2018 22:31

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Zitat:

Zitat von ensaron (Beitrag 1401630)
Die endgültige Lösung war bei mir dann übrigens der Umstieg auf die Overbyte ICS Komponenten, die funktionieren asynchron (und daher ohne Hänger beim Verbindgen etc.). Wenn das für dich eine Option wäre, kann ich ja hier mal ein Beispiel für die Ansteuerung anhängen.

Das Problem ist zwar gelöst, aber da ich die ICS bisher nicht kenne, würde mich Dein Beispiel interessieren.

Mavarik 10. Mai 2018 18:05

AW: Socket-Verbindung herstellen ohne zu blockieren
 
Zitat:

Zitat von KodeZwerg (Beitrag 1401564)
Hi, ich hab hier zwei Sources entdeckt die das Thema Socket+(multi)Thread aufgreifen, vielleicht ist etwas für Dich dabei?

[OT]
Nicht das ich einen guten Source-Code nicht zu schätzen wüsste, aber :

Du kannst den Source auch als File ins Posting bringen und vielleicht dann einzelne rauskopieren, falls Du dazu einen Kommentar anbringen möchtest.

Auf jeden Fall vorher mal einen DelphiSource-Formatter drüber laufen lassen, besonders wenn es so gruselige One-Liner sind.
[/OT]

Zum Thema... Eine UPD/TCP Socket inkl. asynchroner Verarbeitung kann man über die Windows API. in unter 400 LOC implementieren...

Hierzu würde diesen Link empfehlen. (Auch wenn der Sourcelink in diesem Artikel nicht richtig funktioniert - man kann es so runter tippen).

Mavarik :coder:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz