![]() |
Ein TServerSocket, mehrere Threads - wie???
Hallo!
Ich habe einen TServerSocket auf der Form, dann laufen in der Hintergrund mehrere Threads, die relativ oft auf diesen ServerSocket zugraifen müssen. Ich verwende bereits Synchronize() dort, wo auf den Socket zugegrifen wird, doch es klappt irgendwie nicht richtig. Ich habe bemerkt, dass wenn mehrere Threads zu der selben Zeit Daten mit dem ServerSocket verschicken möchten, hangt sich das Programm auf. Gibt es eine bessere Methode, von mehreren Threads auf ein TServerSocket zugreifen? |
Re: Ein TServerSocket, mehrere Threads - wie???
|
Re: Ein TServerSocket, mehrere Threads - wie???
Mit TCriticalSection hängt sich das Programm nicht mehr auf, jedoch werden nicht alle Datensätze übertragen. :cry:
Die Problematik der Sache ist folgende: sehr oft, genauer gesagt fast immer, greifen die Threads fast gleichzeitig auf den ServerSocket und die Daten werden nicht nur an einen Client verschickt, sondern in der Schleife an alle verbundenen Clients. Ich denke, diese Übertragung in der Schleife braucht Zeit und irgendwas wird da blockiert, so dass nicht alle Threads an den Socket wirklich rankommen... Keine Ahnung. Noch Ideen? Ich überlege mir jetzt, eine Art "Zwischenspeicher" aufzubauen, auf den der Socket regelmäßig, z.B. mit einem Timer oder so, zugreift und leert, indem die gesammelten Daten verschickt werden. Ich habe aber noch keine gewisse Vorstellung wie so was aussehen könnte. Es muss aber richtig schnell sein. Hatte jemand schon so was gemacht? |
Re: Ein TServerSocket, mehrere Threads - wie???
Ich habe gerade ohne Synchronize() und ohne TCriticalSection versucht. Es hat sich nicht aufgehängt und komischerweise wurden mehr Datensätze übertragen, als mit TCriticalSection. :roll:
|
Re: Ein TServerSocket, mehrere Threads - wie???
Und ich glaube du programmierst Müll ;) Allein durch die Verwendung einer Critical Section ändert sich nämlich absolut nichts am Programmablauf, ausser dass verhindert wird dass mehrere Threads gleichzeitig auf ein Objekt oder was immer zugreifen, was sie keinesfalls dürfen.
Wenn aber dann wie du sagst zu wenig Datensätze übertragen werden muss der Fehler ganz wo anders liegen. |
Re: Ein TServerSocket, mehrere Threads - wie???
Woran kann es denn liegen, dass nicht alle Datensätze ankommen?
|
Re: Ein TServerSocket, mehrere Threads - wie???
vielleicht solltest du dir überlegen einen patch thread zu erstellen oder das hald im hauptprogramm zu machen, und nicht mehrere threads irgendwas verschicken lassen.
Mach einfach einen message Queue und lass die komponenten verschicken so schnell sie hald können. Auch könntest du hier gleich messages zusammenfassen und damit größere Packete verschicken. Irgendwie kommt mir das chaos von dem du mir da erzählst nicht sinnvoll vor :) Arnulf |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 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