Einzelnen Beitrag anzeigen

Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#3

Re: Zugriffsverletzung bei(Kommunikations)Timeout mit overla

  Alt 1. Okt 2007, 13:00
Erstmal vielen Dank für die schnelle Antwort.

Zitat von Robert Marquardt:
Das ist die uebliche Verwechslung von Pointer auf Struktur und Struktur.
Verstehe das nicht genau. Was genau bedeute Verwechslung?

Zitat von Robert Marquardt:
Delphi-Quellcode:
procedure InitOverlapped(var Overlapped: TOverlapped);
begin
  Overlapped.Offset := 0;
  Overlapped.OffsetHigh := 0;
  Overlapped.Internal := 0;
  Overlapped.InternalHigh := 0;
  Overlapped.hEvent := CreateEvent(nil,True,False,'');
end;
Der Eventname ist verdaechtig ein anonymer Event verwendet nil statt ''.
Ist ein ManualReset-Event noetig?
Ich muss zugeben, dass ich mich damit noch nicht auseinandergesetzt habe, weil die Zugriffsverletzung schon bei 'Overlapped.Offset := 0;' auftritt. Habe dieses Codesegment so im Netz gefunden. Hab es erstmal so übernommen. Wie schon angedeutet, bin ich mit sowas noch nicht in Berührung gekommen. Leider hilft die Delphi Hilfe da auch nicht weiter

Zitat von Robert Marquardt:
Hier setzt sich der Fehler fort.
Delphi-Quellcode:
function ReceiveCommand(...):..
var
  ...
  Overlapped: TOverlapped;
begin
  InitOverlapped(Overlapped);
  Ret := UsbBulkRead(deviceHandle, 0, 0, 0, @USBcb, 8, BytesReceived, @Overlapped);
Wird denn nach UsbBulkRead auf den Event gewartet? Wenn nicht wird die Funktion verlassen und Overlapped wird zerstoert. Es muss sichergestellt werden das Overlapped solange existiert bis UsbBulkRead den Event nicht mehr triggert.
Also mein Ansatz sollte folgender sein: Soweit ich das verstanden habe, wird die Funktion (UsbBulkRead) sofort wieder verlassen, wenn ich das Overlapped verwende. Nun möchte ich eine gewisse (Timeout-) Zeit nach dem Lesen warten und dann schauen ob gelesen wurde oder nicht. Ist das so zu realisieren oder habe ich da was falsch verstanden?

Nochmals vielen Dank!
  Mit Zitat antworten Zitat