AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Prism [Compact Framework] Benutzung von BeginRead
Thema durchsuchen
Ansicht
Themen-Optionen

[Compact Framework] Benutzung von BeginRead

Ein Thema von Tormentor32 · begonnen am 20. Sep 2007 · letzter Beitrag vom 20. Sep 2007
Antwort Antwort
Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#1

[Compact Framework] Benutzung von BeginRead

  Alt 20. Sep 2007, 14:02
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"
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 TcpClient.GetStream.BeginRead() und TcpClient.GetStream.EndRead() nutzen.

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 FClient.GetStream.BeginRead(ReceiveArray,0,length(ReceiveArray),{callback},{state}); Die letzten beiden Parameter sind es die mir "Sorgen" bereiten. In der Hilfe steht dazu:
Zitat von Delphihilfe:
callback
Der AsyncCallback-Delegat, der nach Abschluss von BeginRead ausgeführt wird.
state
Ein Objekt, das zusätzliche, benutzerdefinierte Daten enthält.
Also fix weitergeschaut:
Zitat von Delphihilfe:
AsyncCallback
Verweist auf die Rückrufmethode, die nach Abschluss des asynchronen Vorgangs aufgerufen werden soll.

Die Deklaration der Rückrufmethode muss dieselben Parameter aufweisen wie die Deklaration des AsyncCallback-Delegaten.
Die Information zu state ist quasi null

Ähnlich verhält es sich mit der Endread Methode:FClient.GetStream.EndRead({AsyncResult}) Die Hilfe schreibt dazu
Zitat von Delphihilfe:
EndRead
Behandelt das Ende eines asynchronen Lesevorgangs.
Parameter
asyncResult
Ein IAsyncResult, das einen asynchronen Aufruf darstellt.
Na Toll und was ist das jetzt?
Zitat von Delphihilfe:
Stellt den Status eines asynchronen Vorgangs dar.
Alle Beispiele, die ich in der Hilfe oder im Netz finden konnte, entweder in C# oder in VB. Daher hoffe ich, dass mir jemand von euch erklären kann was es mit diesem AsyncCallback, state und IAsyncResult auf sich hat, ich blicke da einfach nicht richtig durch.

Vielen Dank schonmal,

Ritsch
Richard Mahr
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: [Compact Framework] Benutzung von BeginRead

  Alt 20. Sep 2007, 15:03
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
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#3

Re: [Compact Framework] Benutzung von BeginRead

  Alt 20. Sep 2007, 15:48
@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
Richard Mahr
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 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