Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Thread Zugriffsverletzung (https://www.delphipraxis.net/29389-thread-zugriffsverletzung.html)

sieppl 8. Sep 2004 15:51


Thread Zugriffsverletzung
 
Diese Klasse
Delphi-Quellcode:
  TMyListView = class(TCustomListView)
  private
    FThumbnailThread: TThumbnailThread;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure TreeUpdate(NewRoot: PItemIDList);
benutzt einen TThread (TThumbnailThread) wie man sieht. Ich verstehe nicht, warum ich im Konstruktor von TMyListView auf sämtliche Methoden des Threades zugreifen kann und in TreeUpdate eine Zugriffsverletzung bekomme. :wall:

Delphi-Quellcode:
procedure TMyListView.TreeUpdate(NewRoot: PItemIDList);
begin
  if (NewRoot <> nil) then
  begin
    FThumbnailThread.Suspend; //HIER ZUGRIFFSVERLETZUNG!!! 
  end;
end;
Hier noch die Thread-Klasse (Standard):
Delphi-Quellcode:
TThumbnailThread = class(TThread)
  private
    FListView: TMyListView;
  protected
    procedure Execute; override;
  public
    constructor Create(const ListView: TMyListView);
    destructor Destroy; override;
  end;
Der Thread läuft übrigens. (Endlos Schleife mit Sleep(1000)) Nur diese blöde Zugriffsverletzung, die ich ziemlich unlogisch finde..

DANKE!

mirage228 8. Sep 2004 15:52

Re: Thread Zugriffsverletzung
 
Hi,

um auf Daten der VCL Form zuzugreifen (aus einem Thread aus), solltest du Delphi-Referenz durchsuchenSyncronize verwenden.

mfG
mirage228

Gruber_Hans_12345 8. Sep 2004 15:56

Re: Thread Zugriffsverletzung
 
wo und wie erzeugtst du FThumbnailThread (bzw. wo wirds zugewiesen ?)

sieppl 8. Sep 2004 15:59

Re: Thread Zugriffsverletzung
 
Zitat:

Zitat von Gruber_Hans_12345
wo und wie erzeugtst du FThumbnailThread (bzw. wo wirds zugewiesen ?)

Delphi-Quellcode:
constructor TMyListView.Create(AOwner: TComponent);
begin
  inherited;
  FThumbnailThread := TThumbnailThread.Create(Self);
  FThumbnailThread.Resume; //Funktioniert
end;
Delphi-Quellcode:
constructor TThumbnailThread.Create(const ListView: TMyListView);
begin
  inherited Create(True);
  Priority := tpLowest;
  FreeOnTerminate := True;
  Self.FListView := ListView;
end;

sieppl 8. Sep 2004 16:01

Re: Thread Zugriffsverletzung
 
Zitat:

Zitat von mirage228
Hi,
um auf Daten der VCL Form zuzugreifen (aus einem Thread aus), solltest du Delphi-Referenz durchsuchenSyncronize verwenden.

Danke für den Hinweis, ist mir bekannt. Wie man sehen kann, greife ich nur von TMyListView auf den Thread zu, nicht umgekehrt.

Gruber_Hans_12345 8. Sep 2004 16:03

Re: Thread Zugriffsverletzung
 
und wie / wo wird TreeUpdate aufgerufen ?

und ist TMyListView und TWOCListView das selbe ?

sieppl 8. Sep 2004 16:08

Re: Thread Zugriffsverletzung
 
Zitat:

Zitat von Gruber_Hans_12345
und wie / wo wird TreeUpdate aufgerufen ?

aus einer anderen Klasse.
Zitat:

und ist TMyListView und TWOCListView das selbe ?
sorry, habe ich bereits angepasst. ja ist das selbe!

Gruber_Hans_12345 8. Sep 2004 16:16

Re: Thread Zugriffsverletzung
 
Kannst denn Code der TreeUpdate aufruft posten ?
Ist die Variabel der Klasse wo du TreeUpdate aufrufst richtig initialisiert ?

sieppl 8. Sep 2004 16:26

Re: Thread Zugriffsverletzung
 
Delphi-Quellcode:
 TMyShellTreeView = class(TShellTreeView)
  private
    FMyListView: TMyListView;
  protected
    function CanChange(Node: TTreeNode): Boolean; override;
  published
    property WMyListView: TMyListView read FMyListView write FMyListView;
  end;
Delphi-Quellcode:
function TMyShellTreeView.CanChange(Node: TTreeNode): Boolean;
var
  Fldr: TShellFolder;
begin
  Result := inherited CanChange(Node);
  if Result and Assigned(Node) then
  begin
  if Assigned(FMyListView) then
    Fldr := TShellFolder(Node.Data);
    FMyListView.TreeUpdate;//(Fldr.AbsoluteID); // ****
  end;
end;
**** Habe mal den Parameter überall entfernt, um den Fehler in der PIDL auszuschließen.
-> Immer noch ein Zugriffsfehler..

Gruber_Hans_12345 8. Sep 2004 16:30

Re: Thread Zugriffsverletzung
 
setz mal nen Breakpoint in die procedure CanChange und schau, ob FMyListView das ist, was es sein soll, um sicher zu stellen, das du nicht von einer ungültigen Klassen Variabel eine Methode aufrufst (assigned(FMyListView) kann zu wenig sein, wenn FMyListView irgendwann mal gültig war und dann .Free aber nicht auf nil gesetzt wurde !)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.
Seite 1 von 2  1 2      

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