Ersteinmal herzlich wilkommen in der
DP!
Zweitens: die [ delphi] [ /delphi]-Tags (ohne Leerzeichen) stellen deinen Code im Beitrag formatiert und gehighlighted dar.
Drittens: Das "inherited" sollte im Costruktor
immer als erstes kommen, da du sonst u.U. eine Propertiy setzt, die nachher von den Elternklassen wieder überschrieben wird.
Delphi-Quellcode:
constructor TProzessThread.Create(Tree: TTreeView);
Begin
inherited Create(True); <--\
| getauscht
FreeOnTerminate := True; <--/
end;
Und folgendes ist nicht ganz so koscher:
Delphi-Quellcode:
procedure TProzessThread.Execute;
Var I : Integer;
Node : TTreeNode;
begin
Repeat
Begin
for I := 0 to FMain.Treeview1.Items.Count -1 do // HIER KÖNNTE ES KNALLEN,
// DA UNSYNCHRONISIERTER ZUGRIFF AUF FMAIN
begin
Node:= FMain.Treeview1.Items[I]; // HIER AUCH
TBCC(Node.Data).DataExchange(Node);
Synchronize(UpdateMain);
end;
CycleTime:= GetTickCount;
end;
until Terminated
end;
end.
Das "begin" und "end" bei einer repeat..until-Schleife kannst du dir übrigends sparen
.
Die Zugriffe würde ich vermeiden, indem du deiner Threadklasse ein paar Variablen spendierst, und diese mit den nötigen Werten bei der Erzeugung füllst. Somit kannst du nachher schön auf Variablen des Threads zugreifen, ohne solche "Kreuzgriffe" auf's Formular. Ist auf jeden Fall sauberer, auch wenn das jetzige klappt.
Dann solltest du, um das Problem der Auslastung zu verringern
nach dem createn des Threads die seine Priority verringern (da hilft die ).
Aber trotzdem wirst du auch bei tpIdle immer 100% Gesamtlast haben, da dein Programm dann ja immer zum Zuge kommt, wenn nichts anderes ansteht. Nur lässt es jetzt jedem anderen Thread/Prozess den Vortritt.
Ein kleiner Vermutstropfen: Der Synchronized-Aufruf, aber es ist ja nur einer, und lässt sich wahrscheinlich auch schwer vermeiden
.
Ich hoffe, ich konnte etwas helfen
Gruss,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel