![]() |
AW: Socket-Verbindung herstellen ohne zu blockieren
Genau das ist der Plan. Siehe weiter oben ;)
|
AW: Socket-Verbindung herstellen ohne zu blockieren
Zitat:
|
AW: Socket-Verbindung herstellen ohne zu blockieren
Zitat:
|
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:
(Das Sleep(100) im except-Zweig ist nur für mich zum Haltepunkt setzen.)
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 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? |
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?
|
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 :(
|
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.) |
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! |
AW: Socket-Verbindung herstellen ohne zu blockieren
Zitat:
|
AW: Socket-Verbindung herstellen ohne zu blockieren
Zitat:
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 ![]() Mavarik :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 Uhr. |
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