Entwickler-Ecke

Sonstiges (Delphi) - TThread problem


fealXX - Mo 31.01.11 16:47
Titel: TThread problem
Hallo!
Ich knabbere seit gestern Nacht an folgendem Problem:
Es wird ein Array mit TThreads erstellt und mit TThreads dann gefüllt und dann soll ein Wer zugewiesen werden, welcher in der ListView Caption steht.

Delphi-Quelltext
1:
Threads[Threadcount].Ordner := ListView.Items[I].Caption;                    

Das Funktioniert auch.
Ausgabe der beiden Variablen per showmessage sind auch kein Problem und enthalten auch den richtigen Wert.
Greife ich jetzt aber im TThread auf Ordner zu, zack, ZugriffsVerletzung, Lesen von Adresse 000000 -_-'

Das Internet hat mir verraten das es sich hierbei wahrscheinlich um einen Pointer handelt, der ins Nirwana zeigt, was für mich aber nicht so richtig Sinn macht, da der String ja aus dem ListView in die Variable Ordner kopiert wird, oder nicht?
Und falls nicht, wie mache ich das dann?

Gruß


Bergmann89 - Mo 31.01.11 17:45

Hey,

wie füllst du denn das Array mit Threads? Kanst du mal die Teile der Klasse zeigendie relevant sind? Normale TThreads können das ja nicht sein, da es da meines Wissens nach keine "Ordner"-Eigenschaft gibt.

MfG Bergmann.


Xion - Mo 31.01.11 17:55

user profile iconfealXX hat folgendes geschrieben Zum zitierten Posting springen:
Greife ich jetzt aber im TThread auf Ordner zu, zack, ZugriffsVerletzung, Lesen von Adresse 000000 -_-'


Hast du denn das Array überhaupt initialisiert? Sowas wie Threads[x]:=TThread.Create; müsste irgendwo stehen.

Nächster Punkt:

user profile iconfealXX hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
Threads[Threadcount].Ordner := ListView.Items[I].Caption;                    


ThreadCount (bzw Count allgemein) ist meist so groß wie die Länge des Arrays. Da das array aber bei 0 anfängt, ist [Count-1] das letzte Element.


jaenicke - Mo 31.01.11 18:03

Du kannst ohnehin nicht von außen einfach so auf die Threads zugreifen. Da fehlt die Synchronisierung. Warum übergibst du den Wert nicht einfach direkt über den Konstruktor?


fealXX - Mo 31.01.11 18:54

Die Klasse:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  Threadname = class(TThread)
  Public
    Ordner:string;
  protected
    procedure Execute; override;
  end;


Die Threads im Array werden initialisiert, das sieht so aus:
(Threadcount wird im OnCreate auf 0 gesetzt, Threads ist mit array[1..10] of Threadname deklariert)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  
  for I := 0 to ListView.Items.Count - 1 do
  begin
      //Thread
      inc(Threadcount);
      Threads[Threadcount] := Threadname.Create(true);
      Threads[Threadcount].Ordner := ListView.Items[I].Caption;
      showmessage(Threads[Threadcount].Ordner);
      showmessage(ListView.Items[I].Caption);
  end;


Muss man auch beim übergeben von Daten an den Thread das via Synchronize machen?
Ich dachte das ist nur der Fall wenn man aus dem Thread auf den Hauptthread zugreifen will?


Regan - Mo 31.01.11 19:12

user profile iconfealXX hat folgendes geschrieben Zum zitierten Posting springen:
Greife ich jetzt aber im TThread auf Ordner zu, zack, ZugriffsVerletzung, Lesen von Adresse 000000 -_-'

Dann wäre interessant, wenn du uns diese Methode mal zur Verfügung stellst ;)


fealXX - Mo 31.01.11 19:25

Die AV tritt auf, egal was ich damit mache!
in dem fall ist es

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  I := 0;
  if FindFirst(Ordner+'*.*',$3F,SR)=0 then begin # hier tritt die AV auf
    repeat
      if (SR.Name<>'.'and (SR.Name<>'..'AND ((SR.attr And fadirectory) = 0then
u
s
w
.
.
.


Xion - Mo 31.01.11 22:46

user profile iconfealXX hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  
  for I := 0 to ListView.Items.Count - 1 do
  begin
      //Thread
      inc(Threadcount);
      Threads[Threadcount] := Threadname.Create(true);
      Threads[Threadcount].Ordner := ListView.Items[I].Caption;
      //[...]
  end;

Die vergrößterst ja auch dein array garnicht (SetLength). Oder machst du das irgendwann vorher?


fealXX - Mo 31.01.11 23:21

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:

Die vergrößterst ja auch dein array garnicht (SetLength). Oder machst du das irgendwann vorher?

Das Array ist mit 1..10 definiert, das ListView kann nicht mehr als 5 Einträge beinhalten!


Xion - Di 01.02.11 08:53

Am besten du hängst mal dein Projekt (oder einen Teil davon) an, damit wir uns das mal "live" angucken können ;)


fealXX - Mi 02.02.11 02:30

Problem ist gefunden, es hing mit dem Array zusammen.
Das Array wurde auf die Länge Threadcount gesetzt, dann wurde auf Threads[Threadocunt] zugegriffen. (Code wurde schon angepasst seit dem posten)
Das das bei 0 nicht Funktioniert, da hab ich natürlich nicht dran gedacht.
SetLength (Threads,Threadcount + 1) löste das Problem.

Vielen Dank an alle!