![]() |
BeginThread mit Paramater self übergeben.
hi,
habe eine Klasse und möchte diese gerne bei BeginThread mit als pointer übergeben. Wie kann ich dann in der Thread Procedure drauf zugreifen?
Delphi-Quellcode:
müste doch so funktionieren, oder?
TMyClass = class
private procedure .... public procedure irgendwas; procedure test; end; ... function MeinThread(p : Pointer) : integer; var pMyClass : ^TMyClass; begin pMyClass := p; pMyClass^.irgendwas; //<- fehler, Zugriffsverletzung end; ... procedure TMyClass.test; begin BeginThread(nil,0,@MeinThread, @self, 0, ThreadId); end; bekomme immer einen fehler..... |
Re: BeginThread mit Paramater self übergeben.
Zitat:
Was für einen Fehler und wo? |
Re: BeginThread mit Paramater self übergeben.
ok wurde geändert.....
|
Re: BeginThread mit Paramater self übergeben.
eine Objectinstanz ist bereits ein pointer. Wenn du dir die Adresse von Self holst bekommst du eine Adresse vom Stack (wo der unsichtbare Self-Pointer liegt). Übergebe direkt Self (gegebenfalls einfach nach Pointer casten)
|
Re: BeginThread mit Paramater self übergeben.
Du kannst auch die Thread-Funktion zu einer Methode deiner Klasse machen:
![]() Aber wo hast du jetzt was geändert? |
Re: BeginThread mit Paramater self übergeben.
er hat im quelltext einen kommentaar dahinter gemacht mit dem Fehler.
@luckie: Dein Code macht aber auch nichts anderes als diese globale Funktion zu erzeugen (nur das sie dann nicht deutlich lesbar im Quelltext steht) und darin wird dann eine methode aufgerufen. Das kann er ja auch machen in dem er es selbst durchleitet (was er ja vor hat) |
Re: BeginThread mit Paramater self übergeben.
da ich kein assembler lesen kann weis auch nicht was diese methode genau macht.
habe self jetzt ohne @ übergeben, bekomme jedoch weiterhin eine EAccessViolation....... in dieser Threadmethode möchte ich mit TidTcpClient die daten auslesen. Und bei ReadBuffer puff..... kann aber auch nicht vom pointer den port oder so auslesen. irgend was bei der übergabe läuft schief..... |
Re: BeginThread mit Paramater self übergeben.
Zitat:
|
Re: BeginThread mit Paramater self übergeben.
Man schaue sich doch mal den Quelltext zu TThread an. Dort wird auch das Objekt an die Threadfunktion weitergegeben.
|
Re: BeginThread mit Paramater self übergeben.
Zitat:
|
Re: BeginThread mit Paramater self übergeben.
ok habes gefunden, aber wie kann ich dann auf meine klasse zugreifen?
bekomme ja immer die fehlermeldung..... |
Re: BeginThread mit Paramater self übergeben.
bin jetzt schon weiter gekommen und habe da einen komischen fehler.
Delphi-Quellcode:
wenn ich eigenschaften der klasse aufrufe ist alles bestens, wenn ich auf fclient zugreifen möchte bekomme ich einen fehler :gruebel:
TMyClass = class
private fBoolean : Boolean; fClient : TidTcpClient; public procedure irgendwas; procedure test; end; ... function MeinThread(p : Pointer) : integer; var pMyClass : ^TMyClass; b : boolean; port : integer; begin pMyClass := p; b := pMyClass^.fBoolean; //<- ok port := pMyClass^.fClient.port; //<- fehler end; ... procedure TMyClass.test; begin BeginThread(nil,0,@MeinThread, Pointer(self), 0, ThreadId); end; hat das was mit dem pointer zu tun? //edit bekomme auch einen EOSError code 5 |
Re: BeginThread mit Paramater self übergeben.
wenn ich fClient bei beginthread übergebe kann ich drauf zugreifen, aber nicht über die klasse.... ich check es nicht :gruebel:
|
Re: BeginThread mit Paramater self übergeben.
Bei der Übergabe des Parameters castest du nach Pointer (ohne mit @ die Adresse zu nehmen), aber in der Thread-Funktion dereferenzierst du mit ^, das ist ein Widerspruch. Du musst in der Thread-Funktion wieder in den Klassentype casten.
|
Re: BeginThread mit Paramater self übergeben.
:wall: na super, danke @Apollonius
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz