![]() |
[Compact Framework] Benutzung von BeginRead
Hallo,
ich bin dabei, ein Client-Programm zu entwickeln, das Daten von einem Server empfängt und anzeigt. Das Ganze läuft auf einem PDA, bzw PDA Emulator. In diesem Fall handelt es sich um Strings, die mit vom Server aus gesendet werden, abgegrenzt durch #10#13 (also WriteLn vom IdTcpServer) Jetzt darf das Programm aber nicht blockieren, wenn mal keine Daten kommen, also war das magische Stichwort "Thread" :D Nach langer Recherche sah ich nun zwei Möglichkeiten, dies zu realisieren: 1. Den ganzen Client in einen Thread auslagern, leider habe ich keine Ahnung, wie man unter .Net einen Thread erstellt, dazu konnte ich bisher nichts hilfreiches finden, ich habe mich auch auf die zweite Möglichkeit konzentriert 2. Die Methoden
Delphi-Quellcode:
und
TcpClient.GetStream.BeginRead()
Delphi-Quellcode:
nutzen.
TcpClient.GetStream.EndRead()
Ich habe mich erstmal für die zweite Methode entschieden, da sie mir doch einfacher erscheint. Doch auch hier habe ich ein Problem, denn leider verstehe ich den Umgang mit diesen Methoden nicht richtig :(
Delphi-Quellcode:
Die letzten beiden Parameter sind es die mir "Sorgen" bereiten. In der Hilfe steht dazu:
FClient.GetStream.BeginRead(ReceiveArray,0,length(ReceiveArray),{callback},{state});
Zitat:
Zitat:
Ähnlich verhält es sich mit der Endread Methode:
Delphi-Quellcode:
Die Hilfe schreibt dazu
FClient.GetStream.EndRead({AsyncResult})
Zitat:
Zitat:
Vielen Dank schonmal, Ritsch |
Re: [Compact Framework] Benutzung von BeginRead
Erst einmal der Standardsatz: .Net programmieren wollen, aber C# nicht lesen können - no-go. Da Java-artige Syntax nicht gerade zu den schwerst verständlichen gehört (der Delphi-Programmierer wird Pascal natürlich trotzdem vorziehen ;) ), würde ich auf jeden Fall einmal einen Nachmittag Zeit nehmen, um die Sprache zu verinnerlichen.
BTT: Als Callback musst du eine Methode mit einem IAsyncResult-Parameter übergeben, die dann asynchron aufgerufen wird und in der du EndRead aufrufst, um die Daten zu erhalten und zu bearbeiten. EndRead blockiert solange, bis die Daten verfügbar sind, was aber kein Problem darstellt, da wir uns ja gerade in einem parallelen Thread befinden. Nun muss EndRead nur noch irgendwie mitgeteilt werden, welche Daten es denn auslesen soll, was eben mit dem IAsyncResult-Parameter geschieht. BeginRead tritt also das Ganze los und gibt dir den Parameter, mit dem du dann passend EndRead aufrufen kannst. Zu state wirst du nicht mehr Informationen finden, denn das Stichwort wurde schon genannt: benutzerdefiniertes Objekt. Das Framework interessiert es überhaupt nicht, was in state steckt, bzw. ob er einfach nil ist. Hast du jedenfalls einen vernünftigen Wert übergeben und willst ihn dann im asynchronen Callback auswerten, bekommst du ihn per asyncResult.AsyncState. Unter 1.1 wirst du meistens den Stream übergeben, da du ihn ja für den EndRead-Aufruf benötigst, mit 2.0 und seinen anonymen Methoden ist state quasi ausgestorben. Noch einmal zusammengefasst:
Code:
Hauptthread:
- hole Stream s - rufe s.BeginRead auf (non blocking), state = s Nebenthread (Methode mit Parameter asyncResult: IAsyncResult): - hole Stream s aus asyncResult.AsyncState - rufe s.EndRead auf (blocking) - bearbeite Daten |
Re: [Compact Framework] Benutzung von BeginRead
@Standardsatz: Es gibt ja auch einen Unterschied zwischen müssen und wollen ;-)
So auf jeden Fall Danke für diese Erklärung, jetzt ist mir einiges klarer. Ich kanns jetzt leider nicht ausprobieren, weil ich jetzt wieder was anderes tun muss, aber sobald ich das kann werde ich hier Rückmeldung geben und eventuell nochmal nachfragen :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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