Forum: Object-Pascal / Delphi-Language
by Zacherl,
20. Jan 2017
Hier mal noch die Alternative mit einer Queue (erscheint mir mit Boardmitteln und ohne großen Aufwand die eleganteste Lösung zu sein):
type
TDataStruct = record
public
Timestamp: Cardinal;
Value: Integer;
end;
var
Queue: TQueue<TDataStruct>;
begin
Forum: Object-Pascal / Delphi-Language
by Zacherl,
20. Jan 2017
Dein Ansatz wird vermutlich tatsächlich noch performanter sein. Dann würde ich aber direkt eine TQueue<> nehmen und den Zugriff manuell mit einem TMonitor btw. einer TCriticalSection absichern. Tatsächlich bevorzuge ich nach wie vor den RingBuffer Ansatz, da dort die Memory Operationen eingespart werden können und man mit lediglich zwei Pointern/Indizes sehr einfach das FIFI Prinzip umsetzen...
Forum: Object-Pascal / Delphi-Language
by Zacherl,
19. Jan 2017
Die eigentliche TThreadList ist keine Liste, sondern verwaltet nur intern eine Solche. Konkret macht LockList folgendes:
function TThreadList.LockList: TList;
begin
TMonitor.Enter(FLock);
Result := FList;
end;
und UnlockList dies:
procedure TThreadList.UnlockList;
begin
TMonitor.Exit(FLock);
Forum: Object-Pascal / Delphi-Language
by Zacherl,
19. Jan 2017
Such mal nach dem Stichword "Consumer-Producer Problem". Wenn dein Consumer (Speichern in Datenbank) nicht hinterherkommt, hast du im Prinzip nur die Möglichkeit die Frequenz des Producers (Datenerfassung) entsprechend zu verringern. Am besten dynamisch. Alternativ - falls die Datenerfassung nur kurze Zeit läuft - könntest du erstmal alle Werte erfassen und danach erst in die Datenbank schreiben...