Autor Beitrag
fealXX
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 31.01.11 16:47 
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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: 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.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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:
ausblenden 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.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 31.01.11 18:54 
Die Klasse:
ausblenden 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)

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 31.01.11 19:25 
Die AV tritt auf, egal was ich damit mache!
in dem fall ist es
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mo 31.01.11 22:46 
user profile iconfealXX hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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?

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
fealXX Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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 ;)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
fealXX Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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!