Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   IdTCPClient in eigenem Thread (https://www.delphipraxis.net/176750-idtcpclient-eigenem-thread.html)

Morphie 24. Sep 2013 12:45

IdTCPClient in eigenem Thread
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

vorab: ich habe noch nicht wirklich viel Erfahrung in der Thread-Programmierung, daher kann es sein, dass ich das Ganze auch komplett falsch angehe ;-)

Ich möchte ein Programm schreiben, das mir den MJPEG-Stream meiner Überwachungskamera(s) anzeigt.
Dazu habe ich mir eine Klasse TMJPEGClient geschrieben, welche von TThread abgeleitet ist.
Im OnExecute instanziiere ich ein TIdTCPClient, baue die Verbindung auf und empfange den Stream.
Sobald ein Frame empfangen wurde, feuere ich ein Event (
Delphi-Quellcode:
NotifyJPEGReceived(Data: TMemoryStream);
über Synchronize ab.

Im GUI-Thread wird dieses Event dann abgerufen und Data in einem Image-Control dargestellt.

Eigentlich funktioniert alles genau so wie ich es mir wünsche.
Aber:
Wenn ich das Programm einfach beende, während der Thread noch läuft, hagelt es Fehlermeldungen:
Zitat:

Im Projekt MJPEGTest.exe ist eine Exception der Klasse EIdSocketError mit der Meldung 'Socket-Fehler # 10093
' aufgetreten.
Zitat:

Im Projekt MJPEGTest.exe ist eine Exception der Klasse EIdWinsockStubError mit der Meldung 'Fehler beim Aufruf der Winsock2-Bibliotheksfunktion recv: Die Anwendung hat die Funktion WSAStartup nicht aufgerufen, oder bei dieser Funktion ist ein Fehler aufgetreten' aufgetreten.
Zitat:

Im Projekt MJPEGTest.exe ist eine Exception der Klasse EIdWinsockStubError mit der Meldung 'Fehler beim Aufruf der Winsock2-Bibliotheksfunktion WSAGetLastError: Die Anwendung hat die Funktion WSAStartup nicht aufgerufen, oder bei dieser Funktion ist ein Fehler aufgetreten' aufgetreten.
Zitat:

Im Projekt MJPEGTest.exe ist eine Exception der Klasse EIdWinsockStubError mit der Meldung 'Fehler beim Aufruf der Winsock2-Bibliotheksfunktion shutdown: Die Anwendung hat die Funktion WSAStartup nicht aufgerufen, oder bei dieser Funktion ist ein Fehler aufgetreten' aufgetreten.
Ich habe das Beispielprojekt mal angehängt... Hat jemand ne Idee, was ich hier falsch mache?

mjustin 24. Sep 2013 13:55

AW: IdTCPClient in eigenem Thread
 
Treten die Exceptions ausserhalb oder innerhalb der IDE (beim Debuggen) auf? Indy Exceptions können während des Debuggens deaktiviert werden. Die WASStartup-Exception dagegen läßt auf einen Bug schliessen. Ich würde die aktuelle Indy 10.6 Version verwenden, eventuell ist dieses Problem damit behoben. p.s. WSAStartup rufe ich in Indy-basierten Hintergrundthreads nicht auf. Wie wird der IdTCPClient denn konkret erzeugt und initialisiert?

Morphie 24. Sep 2013 13:59

AW: IdTCPClient in eigenem Thread
 
Socket-Fehler # 10093 tritt nur innerhalb der IDE auf, die anderen Fehler hingegen auch in der normalen *.exe...
Ich könnte sie ja einfach abfangen und ignorieren, allerdings entsteht durch diesen Fehler auch ein Memory-Leak :(

Ich nutze die Version 10.6.0.497 von XE4. Wo gibt es denn eine aktuellere?

mjustin 24. Sep 2013 15:03

AW: IdTCPClient in eigenem Thread
 
Zitat:

Zitat von Morphie (Beitrag 1229762)
Socket-Fehler # 10093 tritt nur innerhalb der IDE auf, die anderen Fehler hingegen auch in der normalen *.exe...
Ich könnte sie ja einfach abfangen und ignorieren, allerdings entsteht durch diesen Fehler auch ein Memory-Leak :(

Ich nutze die Version 10.6.0.497 von XE4. Wo gibt es denn eine aktuellere?

10093 ist "Successful WSAStartup not yet performed.", passt gut zu den Exceptions.

Ist es ein exotisches Betriebssystem wie Windows 95?

Was passiert wenn man WSAStartup direkt im Projektcode aufruft?

Siehe auch: https://forums.embarcadero.com/messa...essageID=29029

Es gibt zwei verschiedene Funktionen namens WSAStartup, in WinSock und in Indy ...

Morphie 24. Sep 2013 15:09

AW: IdTCPClient in eigenem Thread
 
Zitat:

Zitat von mjustin (Beitrag 1229766)
Ist es ein exotisches Betriebssystem wie Windows 95?

Nee, Windows 7 und Windows 8...

Ich denke eher, dass es an meinem Code liegt, bzw. dass irgendwo in meinem Thread noch ein Fehler schlummert...
Denn eigentlich tut das Programm genau das, was es machen soll. Nur wenn ich die Anwendung beende und der Thread noch läuft, gibt es diese Fehler.

So als würde man Indy irgendwie den Boden unter den Füßen wegziehen... Aber ich kenne mich leider noch zu wenig mit der Thread-Programmierung aus, um selbst auf die Lösung zu kommen =/

MyRealName 24. Sep 2013 15:49

AW: IdTCPClient in eigenem Thread
 
Warum beendest Du den thread nicht einfach und zerstörst alle Objekte darin bevor Du die Anwendung beendest? Einfach die abbruch variable auf True setzen, damit die execute schleife aufhört und dann das Thread objekt im main thread freigeben wenn geschlossen wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 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