Autor Beitrag
Rassi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Sa 04.09.10 16:09 
Hallo.
Ich habe folgendes Problem.
Ich bekomme von einer Messkarte aufgezeichnete Daten in ein Feld (Ringfeld) übergeben.
Zusätzlich bekomme ich die Information wo die neuen Daten und wieviel neue Daten abgelegt sind.
Diese Daten werden dann folgendermaßen abgelegt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
//Daten speichern.
for iZaehler:=int32DataPos to (int32DataPos + int64AvailData) - 1 do
begin
  if (ThreadVari.int32BytesProSample = 1then
    Stream.Write (pbyData[iZaehler], SizeOf(pbyData[iZaehler]))
  else
    Stream.Write (pnData[iZaehler], SizeOf(pnData[iZaehler]));
  end;
end;


Hierbei ist
int32DataPos -> Anfangsposition der Daten im Feld
int64AvailData -> Endposition der Daten im Feld
ThreadVari.int32BytesProSample -> Datenart (Datentyp)
pbyData oder pnData -> Daten

Das Problem hier ist, dass das Speichern zu langsam ist. Es werden bei einem Speicherzyklus ca. 2MB gespeichert. Es dauert viele Sekunden bis diese Speicherschleife alles abgelegt hat.
Ist es nicht möglich diesen Datenbereich in einem abzuspeichern?

Gruß
Rasmus

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hallo.
Habe jetzt zwischenzeitlich ein paar tests gemacht.
Es scheint, dass mit der Übergabe "Write" ein Pointer übergeben wird. Ab dieser Position wird dann die Anzahl der Bytes geschrieben.
Somit kann ich mir die Schleife sparen und der Wirte-Methode die Anzahl der Bytes mitgeben, die ab dem angegebenen Feldindex geschrieben werden sollen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
//Daten speichern.
if (ThreadVari.int32BytesProSample = 1then
  Stream.Write (pbyData[int32DataPos], SizeOf(pbyData[int32DataPos]) * int64AvailData)
else
  Stream.Write (pnData[int32DataPos], SizeOf(pnData[int32DataPos]) * int64AvailData);


Dann geht das Schreiben auch Ratz-Fatz!

Gruß
Rasmus