Autor |
Beitrag |
fealXX
Hält's aus hier
Beiträge: 5
|
Verfasst: 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.
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
      
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)
|
Verfasst: 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
      

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)
|
Verfasst: 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.
_________________ 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Mo 31.01.11 19:12
|
|
fealXX 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      

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)
|
Verfasst: Mo 31.01.11 22:46
_________________ 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      

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)
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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!
|
|