Guten Abend,
ich habe ein Thread-Verständnis-Problem. Mein Programm hat in einem ListView mehrer Computer, welche alle 30 Sekunden auf Erreicgbarkeit geprüft werden. Diese erfolgt in Thread. Das Ergebnis wird an das ListView zurückgeliefert. Das funktioniert auch alles einwandfrei. Bloß wenn ich zur Laufzeit einen neuen Computer hinzufüge, kommt eine Fehlermeldung (ListIndex überschreitet das Maximum). Schließe ich das Program und starte es erneut, funktioniert es wieder. Wenn man EInträge löscht funktioniert auch alles. Was einer warum?
Mein Thread
Delphi-Quellcode:
...
procedure MyThread.Execute;
begin
CoInitialize(
nil);
try
if art = '
CheckServerStatus'
then
CheckServerStatus;
if art = '
ServerStatusToXML'
then
//ServerStatusToXML;
except
on e:
exception do begin
// mache hier irgendetwas mit dem Fehler.
end;
end;
CoUnInitialize();
end;
...
procedure MyThread.CheckServerStatus;
begin
if IsHostAlive(Server) = True
then
begin
frm_main.lv_server.Items[lvid].ImageIndex := 1;
//Server Online
if (status = '
2')
and (frm_main.FirstStart = False)
then
frm_main.lv_server.Items[lvid].SubItems[1] := '
1'
//Server Online
else
frm_main.lv_server.Items[lvid].SubItems[1] := '
';
end
else
begin
frm_main.lv_server.Items[lvid].ImageIndex := 2;
//Server Offine
if (status = '
1')
and (frm_main.FirstStart = False)
then
frm_main.lv_server.Items[lvid].SubItems[1] := '
2'
//Server Online
else
frm_main.lv_server.Items[lvid].SubItems[1] := '
';
end;
end;
lvid ist richtig aber nach dem Hinzufügen, kommt beim ersten Benutzer der Fehler. Warum? Mit Synchronize kommt der gleiche Fehler. Was läuft da falsch? Planlos, ich hoffe auf eine Idee.
Meine Aktualisierungsroutine
Delphi-Quellcode:
procedure Tfrm_main.CheckServerStatus;
var
i : Integer;
Thread : MyThread;
begin
for i := 0 to lv_server.Items.Count - 1 do
begin
Thread := MyThread.Create(True);
Thread.art := 'CheckServerStatus';
Thread.lvid := i; //ListView ItemIndex
Thread.server := lv_server.Items[i].Caption;
Thread.status := IntToStr(lv_server.Items[i].ImageIndex);
Thread.FreeOnTerminate := True;
Thread.Resume;
end;
lbl_overview_servercheck.Caption := FormatDateTime('dd. mmmm yyyy hh:nn:ss', now);
end;