Hallo Zacherl,
vielen Dank für die gute Erklärung. Auf die Idee, die Daten zu kopieren bin ich auch gekommen und habe es so umgesetzt.
Delphi-Quellcode:
type
TValues =
Class
dtTime : TDateTime;
rForce,
rTemperature,
rHumidity : Real;
End;
....
procedure TListThread.Execute;
var
s:
String;
I, i1: Integer;
Values: TValues;
tmpList,
my1List: TList;
dtOld : TDateTime;
rTdelta :REal;
begin
while(True)
do
begin
if (Terminated)
then
begin
listthreadRunning:= FALSE;
exit;
end;
my1List := TList.Create;
// Noch nicht bearbeitete Daten in Temporäre Liste kopieren
try
tmpList := threadList1.LockList;
for I := i1
to tmpList.Count-1
do
begin
Values:= TValues.Create;
Values:= tmpList.Items[I];
my1List.Add(Value);
end;
i1 := i;
finally
threadList1.UnlockList;
end;
// Kopierte Daten abhandeln (z.B. in DB speichern) und Liste wieder löschen
try
for I := 0
to my1List.Count-1
do
begin
Values:= my1List.Items[I];
rTdelta := (Values.dtTime - dtOld)*(24*60*60);
s:=formatDateTime('
yyyy-mm-dd HH:MM:SS.zzz',Values.dtTime)+ format('
: %.7d, %5.3f s', [i1, rTdelta]);
Form1.ListBox1.Items.Add(s);
dtOld := Temp.dtTime;
// Values.Free; // Speicher wieder freigeben NOTWENDIG ?? Führt zu Fehler
end;
Form1.Listbox1.ItemIndex := Form1.Listbox1.Count-1;
// Auf letzte Zeile in Listbox springen
finally
while my1List.Count > 0
do
my1List.Delete(0);
// NOTWENDIG ??
my1List.Free;
end;
Sleep(100);
end;
listthreadRunning:= FALSE;
end;
Da ich bisher nie mit Listen gearbeitet habe wäre ich froh wenn jemannd drauf schaut um mir zu sagen wo ich Problemstellen kreiert habe. Ich bin z.B. nicht sicher, was ich wieder freigeben muss. Viele Beispiele machen einfach
my1List.Free
.
Wenn ich allerdings
Value.Free;
aufrufe stimmt meine Liste nicht mehr
Vielen Dank
Gerd