AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Socket-Verbindung herstellen ohne zu blockieren
Thema durchsuchen
Ansicht
Themen-Optionen

Socket-Verbindung herstellen ohne zu blockieren

Ein Thema von Medium · begonnen am 7. Mai 2018 · letzter Beitrag vom 11. Mai 2018
Antwort Antwort
Seite 2 von 3     12 3      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#11

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 8. Mai 2018, 10:34
Genau das ist der Plan. Siehe weiter oben
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 8. Mai 2018, 11:18
Genau das ist der Plan. Siehe weiter oben
Do it!
  Mit Zitat antworten Zitat
ensaron

Registriert seit: 29. Aug 2008
Ort: 10369 Berlin
63 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 8. Mai 2018, 11:31
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#14

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 8. Mai 2018, 16:32
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?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 8. Mai 2018, 16:46
Landet der Debugger bis in TCustomWinSocket.Open und darin in procedure TCustomWinSocket.DoOpen bzw. TCustomWinSocket.AsyncInitSocket? Oder kommst du da schon gar nicht hin?

Geändert von TiGü ( 8. Mai 2018 um 16:50 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#16

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 8. Mai 2018, 16:53
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#17

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 8. Mai 2018, 18:28
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.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#18

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 8. Mai 2018, 18:42
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!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 1. Dez 2003
Ort: Luterbach (CH)
679 Beiträge
 
Delphi 12 Athens
 
#19

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 9. Mai 2018, 23:31
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.
Roland
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#20

AW: Socket-Verbindung herstellen ohne zu blockieren

  Alt 10. Mai 2018, 19:05
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz