AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread hängt wenn Listview Eintrag bekommt

Ein Thema von Piro · begonnen am 17. Jul 2008 · letzter Beitrag vom 18. Jul 2008
Antwort Antwort
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

Thread hängt wenn Listview Eintrag bekommt

  Alt 17. Jul 2008, 23:08
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 = 'CheckServerStatusthen
     CheckServerStatus;

   if art = 'ServerStatusToXMLthen
     //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;
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Thread hängt wenn Listview Eintrag bekommt

  Alt 17. Jul 2008, 23:11
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.excute;
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;
Nickel
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Thread hängt wenn Listview Eintrag bekommt

  Alt 17. Jul 2008, 23:13
Was soll das bringen? Das kennt er so nicht und kann damit nichts anfangen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Thread hängt wenn Listview Eintrag bekommt

  Alt 17. Jul 2008, 23:20
Autsch! In einen Thread auf ein Oberflächencontrol zugreifen. Das muss ja irgendwo krachen!
Wird denn ab und zu der Kommentar gelesen der in der neuen Unit mit der Thread-Klasse am Anfang steht
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#5

Re: Thread hängt wenn Listview Eintrag bekommt

  Alt 17. Jul 2008, 23:22
Hi,

also das sieht bisher ja ziemlich chaotisch aus. Und @NickelM: Execute wird vom Thread selbst aufgerufen. Sonst würde das ja auch nicht im Thread-Kontext ablaufen, sondern innerhalb des Caller-Threads, sprich hier der VCL-Mainthread.

@daywalker: Wenn Du selbst schon Synchronize erwähnst, weißt Du ja auch das ein Zugriff auf VCL-Objekte immer synchronisiert erfolgen muß. Die ListView ist bestimmt nicht threadsafe...

Bau entsprechende interne Variablen und Properties in den Thread ein, die Werte annehmen und entsprechende synchronisierte Callback-Methoden, um die Informationen an die Oberfläche zurückzugeben.

Wenn nur am Ende zurückgegeben werden soll, kannst Du das im OnTerminate-Ereignis erledigen, da dieses im Kontext des Aufrufers, also hier des Mainthreads, erfolgt.

Gruß Assertor

@Bernhard: Du bist aber auch wieder schnell...
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Thread hängt wenn Listview Eintrag bekommt

  Alt 17. Jul 2008, 23:30
Vielen Dank für die Hinweise. Kenne mich mit Threads noch nicht so aus. Deshalb so chaotisch. Hatte Synchronize weggelassen, da der Fehler auch kam. Ich versuch es mal mit dem OnTerminate Event.

Dank.

Sven
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Thread hängt wenn Listview Eintrag bekommt

  Alt 17. Jul 2008, 23:44
Das OnTerminate Event habe ich eingebaut aber mit der Variableübergabe klappt es nicht so wirklich. Würdet ihr mir etwas mehr dazu sagen?

Delphi-Quellcode:
procedure Tfrm_main.OnThreadTerminate(Sender: TObject);
begin
 ShowMessage('Am Ende');
end;

procedure Tfrm_main.CheckServerStatus;
var
 Thread : MyThread;
begin
 for i := 0 to lv_server.Items.Count - 1 do
 begin
   Thread := MyThread.Create(True);
   Thread.art := 'CheckServerStatus';
   Thread.server := lv_server.Items[i].Caption;
   Thread.FreeOnTerminate := True;
   Thread.OnTerminate := OnThreadTerminate;
   Thread.Resume;
 end;
 lbl_overview_servercheck.Caption := FormatDateTime('dd. mmmm yyyy hh:nn:ss', now);
end;
Wo müssen jetzt die Variablen hin damit ich sie im OnThreadTerminate verwenden kann?

Vielen Dank.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Thread hängt wenn Listview Eintrag bekommt

  Alt 18. Jul 2008, 09:14
Als Felder in deinen Thread (bzw, dann als public properties).
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Thread hängt wenn Listview Eintrag bekommt

  Alt 18. Jul 2008, 13:19
Ich steige da immer noch nicht durch. Habe die Variabeln gesetzt aber ich kann nicht darauf zugreifen.

Thread Unit:
Delphi-Quellcode:
type
  MyThread = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
    procedure CheckServerStatus;
  public
    { Public-Deklarationen }
    art : String;
    status : String;
    lvid : Integer;
  end;
...
procedure MyThread.Execute;
begin
 CoInitialize(nil);
 try
   if art = 'CheckServerStatusthen
     CheckServerStatus;
 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
   status := '1//Server Online
 else
   status := '2'; //Server Online
end;
Meine Main Unit:
Delphi-Quellcode:
procedure Tfrm_main.OnThreadTerminate(Sender: TObject);
begin
 ShowMessage(MyThread.status); // Fehler: Methodenbezeichner erwartet. Welcher soll das sein?
end;

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;
   Thread.server := lv_server.Items[i].Caption;
   Thread.FreeOnTerminate := True;
   Thread.OnTerminate := OnThreadTerminate;
   Thread.Resume;
 end;
 lbl_overview_servercheck.Caption := FormatDateTime('dd. mmmm yyyy hh:nn:ss', now);
end;
Fehler beim Kompilieren. Siehe OnThreadTerminate Prozedure.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz