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
fealXX hat folgendes geschrieben : |
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:
fealXX hat folgendes geschrieben : |
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 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
fealXX hat folgendes geschrieben : |
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) = 0) then u s w . . . |
Xion - Mo 31.01.11 22:46
fealXX hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| for I := 0 to ListView.Items.Count - 1 do begin 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
Xion hat folgendes geschrieben : |
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!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!