Einzelnen Beitrag anzeigen

Kishmet

Registriert seit: 29. Okt 2020
Ort: Großraum Stuttgart
9 Beiträge
 
Delphi 10.4 Sydney
 
#1

Thread sichere Datenabfrage

  Alt 29. Okt 2020, 09:54
Guten Morgen,

(Falls dieses Thema zweimal auftaucht tut es mir leid, mein erster Versuch Wollte nicht so richtig, kann aber sein das er doch noch durchrutscht)

Ich arbeite jetzt seit zwei Jahren mit Delphi (derzeit 10.4.1) und bin nun das erstemal an einem Punkt an dem ich nicht recht weiter komme und auch Online finde ich grade entweder nicht die richtigen Schlagworte oder habe einfach Verständniss Probleme...

Das Drumherum:

Ich habe einen Mainthread der Daten von einem Gerät ausliest und diese sowohl auf dem Monitor darstellt als auch immer hinten an eine Datei anhängt. (eigentlich sind das mehrere threads aber das tut soweit)

Nun habe ich einen zweiten Thread gebastelt, der diese Daten einließt (wirklich nur liest) und auswertet. Dann schreibt er die Ergebnisse in eine andere Datei. Wenn ich in der Messung zurückScrolle sollten dann diese Ereignisse auch vom Main thread ausgelesen und dargestellt werden können. Da die Ergebnisse Variieren lese und werte ich immer alles ein/aus. Das könnte man ändern wäre aber sehr aufwendig und ich bin mir nicht sicher ab das am generellen Problem etwas ändert.

Mein basis Problem:

Manchmal kommt es bei mir zu einer Art Integerüberlauf - ich habe bisher noch nie Zugriffsverletzungen oder derlgeichen bekommen und bin mir nicht sicher woran es liegt.
Delphi-Quellcode:
 
DieKlasse = class
private
  FDataReader : TMyBufferedFileReader;
  FReadDataValueNum: Int64;
  //... und andere
end;

Function DieKlasse.ReadInData(var Abuf: TMyData):Cardinal;
var
  idx: Int64;
begin
  if FReadDataValueNum >= FDataReader.ValueCount then
  begin
    idx := FReadDataValueNum - FDataReader.ValueCount;
    if idx < length(FOnlineWriteCache) then
    begin
      ABuf := FOnlineWriteCache[idx]; //Hier entsteht der fehler(sehr sporadisch) wenn idx zu groß wird (was ja aber eigentlich gar nicht sein kann)
      result := 1;
    end else begin
      result := 0;
    end;
  end else begin
    FDataReader.ValueNumber := FReadDataValueNum;
    result := FDataReader.Read(ABuf, 1);
  end;
end;
1. Ich bin mir immernoch nicht ganz sicher ob einfaches Lesen beim Multithreading ein Problem darstellt?? Ob dabei Müll rauskommt wäre mir an der Stelle auch egal, das Fange ich Ohnehin ab. Aber stellt das Prinzipiell ein Problem dar?

2. Muss ich die Abfragen der Streams in critical Sections packen oder gibt es hier befehle (vorgefertigt) die das Lesen und schreiben bereits Threadsicher machen? Alla: "ReadThisFileAndLockItWhileDoingSo"

3. Wenn ich Critical sections einführe sperren diese dann auch alle Variablen/Dateien usw. die ich innerhalb dieser Section verwende?

Über ein wenig Rat wäre ich super dankbar. Das Thema Threads ist mir einfach immernoch nicht 100% geheuer.

Lieben Gruß
Kishmet

PS: Vielen dank für das Tolle Forum und die Tollen Beiträge vom harten Kern! Ihr seit echt Spitze und ich hab schon soooo viel von euch gelernt!

Geändert von Kishmet (29. Okt 2020 um 11:30 Uhr)
  Mit Zitat antworten Zitat