Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stream Read Error bei TMemoryStream.Seek (https://www.delphipraxis.net/27435-stream-read-error-bei-tmemorystream-seek.html)

cheatzs 10. Aug 2004 09:12


Stream Read Error bei TMemoryStream.Seek
 
Hi Leute,
hab einen ungewöhnlichen Fehler beim Verarbeiten von Eingehenden Nachrichten über ein TIdTcpServer.
Es wird der Fehler "Stream Read Error" bei einem Datenverarbeitendem Stream (nicht der Stream mit dem die Daten empfangen werden) angezeigt. Dabei zeigt der Compiler auf die Zeile:

Delphi-Quellcode:
ActClient^.DataStream.Seek(0,soFromBeginning);
Ich habe keine erkennbaren Fehler gefunden.

Ich vermute allerdings, dass der Fehler aufgrund der verschiedenen Threads beim Empfang verursacht wird.
Hat sich nur ein Computer mit dem Server verbunden, klappt alles wunderbar. Bei schon 2 Computern tritt nach einer Weile (wahrscheinlich wenn sich beide zufällig mal zur selben Zeit anmelden) dieser Fehler auf.

Ich hatte gehofft diesen Fehler zu beheben, indem ich einen eigenen DataStream für jeden verbundenen Computer erstellt habe. Trotzdem tritt er noch auf.

Habt ihr eine Idee, weshalb überhaupt ein Read Stream Error bei der Prozedur Seek aufgerufen werden kann? Oder spinnt womöglich der Compiler und es ist eine andere Zeile?

Viel Dank im Vorraus.

Bye

cheatzs 10. Aug 2004 15:54

Re: Stream Read Error bei TMemoryStream.Seek
 
Hi Leutz,

es liegt nich an dem Seek, sondern an dem Befehl COPYFROM, der direkt darüber steht:

Delphi-Quellcode:
ActClient^.DataStream.CopyFrom(ActClient^.ReceiveStream,ActClient^.ReceiveStream.Size-(SizeOf(Word)+SizeOf(Cardinal)));
Leider weiß ich immer noch nicht, warum...

Bye

franktron 10. Aug 2004 16:01

Re: Stream Read Error bei TMemoryStream.Seek
 
Wiel der andere stream warscheinlich lerr ist oder am ende steht dann kommt nämlich die meldung

cheatzs 10. Aug 2004 16:08

Re: Stream Read Error bei TMemoryStream.Seek
 
Delphi-Quellcode:
    ActClient^.ReceiveStream.Seek(0,soFromBeginning);
    ActClient^.ReceiveStream.Read(cReceiveLength,SizeOf(Cardinal));
    ActClient^.ReceiveStream.Read(wCommandID,SizeOf(Word));
    ActClient^.ReceiveStream.Seek(SizeOf(Word)+SizeOf(Cardinal), soFromBeginning);
    ActClient^.DataStream.CopyFrom(ActClient^.ReceiveStream,ActClient^.ReceiveStream.Size-(SizeOf(Word)+SizeOf(Cardinal)));
    ActClient^.DataStream.Position := 0;
Wie du sehen kannst, stelle ich die Position des ReceiveStream vorher auf die gewünschte Position, sodass niemals der zu kopierende Bereich fehlerhaft sein kann(zu groß oder zu klein).


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