AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi EndOfFile/EndOfData bei Pipe erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

EndOfFile/EndOfData bei Pipe erkennen

Ein Thema von himitsu · begonnen am 10. Okt 2010 · letzter Beitrag vom 31. Okt 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#1

EndOfFile/EndOfData bei Pipe erkennen

  Alt 10. Okt 2010, 21:55
Wenn man mit ReadFile von einer Communications-Resource ließt und es keine/nicht genug Daten gibt, dann schläft der Thread ein, da die Funktion ja wartet, bis genug Daten gelesen wurden.

Kann man also vor dem ReadFile erkennen, ob etwas/genug zum Lesen vorhanden ist?

SetFilePointer liefert hier ja immer 0 und GetFileSize arbeitet eh nicht
und SetCommTimeouts hat leider keine Wirkung.

Klar gäbe es noch andere Wege:
- asynchrones Lesen mit Timeout
- auslagern in einen Thread und die Daten via Callback rüberschicken, wenn was vorhanden ist
- k.A. was sonst noch

Aber ich würde gern direkt auslesen (also kein Thread) und mir wäre es lieb, wenn ich sofort erfahren würde, ob was vorhanden ist (also kein Timeout abwarten).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Okt 2010 um 23:38 Uhr)
  Mit Zitat antworten Zitat
sparky

Registriert seit: 28. Nov 2004
10 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 10:35
Wenn es sich tatsächlich um eine named/unnamed Pipe handelt, empfiehlt sich die WinAPI Funktion PeekNamedPipe.
Code:
if not PeekNamedPipe(LHandle, nil, 0, nil, @LBytesAvail, nil) then
  RaiseLastOSError;
Die Funktion ist nicht blockend (d.h. kein Thread erforderlich) und liefert mit dem obigen Aufruf die Anzahl der verfügbaren Bytes.

Mehr unter http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#3

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 11:14
Nee, geht leider auch nicht
Zitat:
Unzulõssige Funktion
Dennoch danke und willkommen an Board.



Also derzeit scheint es halbwegs gute Ergebnisse über ReadFileEx + SleepEx als TimeOut zu geben.
Ich denke mal ich werde dieses ausbauen und bei einem TimeOut einige nachfolgende Leseoperationen überspringen (einfach behaupten es gäbe keine Daten), bevor erneut gelesen wird, um den Zeitverlust durch den TimeOut zu kompensieren.


Nja, als was dieses genau läuft, weiß ich auch nicht, es ist jedenfalls keine Datei.

Es handelt sich um ein Eingabegerät (HID):
'\\?\hid#vid_057e&pid_0306#2&32f7afb6&0&0000#{4d1e 55b2-f16f-11cf-88cb-001111000030}'

Na gut, ich versuch dann später mal mit dem ReadFileEx+SleepEx weiterzuprobieren.
Leider mußte ich so auch die Ausgabe asynchron gestalten, da ich eigentlich nur ein gemeinsames FileHandle verwenden wollte ... aber mal sehn.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 11:19
Es handelt sich um ein Eingabegerät (HID):
'\\?\hid#vid_057e&pid_0306#2&32f7afb6&0&0000#{4d1e 55b2-f16f-11cf-88cb-001111000030}'
Ach das. Diese Bezeichnungen finde ich auch immer nur geil.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#5

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 11:35
Es handelt sich um ein Eingabegerät (HID):
'\\?\hid#vid_057e&pid_0306#2&32f7afb6&0&0000#{4d1e 55b2-f16f-11cf-88cb-001111000030}'
Ach das. Diese Bezeichnungen finde ich auch immer nur geil.
Von der Schnittstelle her ist es ja egal um was es genau geht.
Es ist einfach ein Gerät, welches über die Human Interface Device-Schnittstellen (HID) angesprochen wird.
Also wen interessiert es hier wirklich, ob es ein Wü-kompatibles-Eingabegerät ist?

PS: Es steht alles genau drin
- HID > die Schnittstelle
- vid_057e > die Vendor-ID $057E
- pid_0306 > die Product-ID $0306
= Wii-Controler via HID
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Okt 2010 um 11:38 Uhr)
  Mit Zitat antworten Zitat
sparky

Registriert seit: 28. Nov 2004
10 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 11:54
Also wenn es sich um folgendes Gerät handelt:

HID\VID_057e&PID_0306
HID_DEVICE_SYSTEM_GAME
HID_DEVICE_UP:0001_U:0005
HID_DEVICE

Les Paul Controller for Nintende Wii Model No. 95125.805 (ok, hätte vor dem antworten mal schauen sollen, was schon geschrieben wurde)

könnte vielleicht das folgende Projekt interessant sein:

sourceforge - wiiuse (edit: besonders die Funktionen in io_win.c)

Ist zwar C-Code, aber relativ einfach gehalten und es geht ja im wesentlichen um die API-Aufrufe.
In dem Zusammenhang ist vielleicht auch noch folgender Bereich der MSDN-Library interssant:

Using Raw Input

Geändert von sparky (11. Okt 2010 um 12:02 Uhr)
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#7

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 12:42
Dafür ist doch das Overlapped Flag in Readfile da. Daraufhin dann ein WaitForMultipleObjects. Da kannst du dann nach dem Event von ReadFile und ein AbbruchEvent oder Timeout prüfen und das alles im aktuellen Thread.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  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 02:01 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