Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi BeginThread mit Paramater self übergeben. (https://www.delphipraxis.net/110005-beginthread-mit-paramater-self-uebergeben.html)

Thomas83 11. Mär 2008 14:17


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:
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;
müste doch so funktionieren, oder?
bekomme immer einen fehler.....

Luckie 11. Mär 2008 14:21

Re: BeginThread mit Paramater self übergeben.
 
Zitat:

Zitat von Thomas83
bekomme immer einen fehler.....

:roll:
Was für einen Fehler und wo?

Thomas83 11. Mär 2008 14:25

Re: BeginThread mit Paramater self übergeben.
 
ok wurde geändert.....

SirThornberry 11. Mär 2008 14:30

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)

Luckie 11. Mär 2008 14:35

Re: BeginThread mit Paramater self übergeben.
 
Du kannst auch die Thread-Funktion zu einer Methode deiner Klasse machen: http://www.michael-puff.de/Artikel/2...backMethod.php Ist meiner Meinung nach eleganter.

Aber wo hast du jetzt was geändert?

SirThornberry 11. Mär 2008 14:36

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)

Thomas83 11. Mär 2008 14:46

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.....

Luckie 11. Mär 2008 15:11

Re: BeginThread mit Paramater self übergeben.
 
Zitat:

Zitat von SirThornberry
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)

Nein, mit meinem Code kann er seine Thread-Funktion zu einer Methode seiner Klasse machen.

andreash 11. Mär 2008 15:14

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.

Thomas83 11. Mär 2008 15:32

Re: BeginThread mit Paramater self übergeben.
 
Zitat:

Zitat von andreash
Man schaue sich doch mal den Quelltext zu TThread an. Dort wird auch das Objekt an die Threadfunktion weitergegeben.

wo?

Thomas83 11. Mär 2008 16:13

Re: BeginThread mit Paramater self übergeben.
 
ok habes gefunden, aber wie kann ich dann auf meine klasse zugreifen?
bekomme ja immer die fehlermeldung.....

Jackie1983 11. Mär 2008 19:17

Re: BeginThread mit Paramater self übergeben.
 
bin jetzt schon weiter gekommen und habe da einen komischen fehler.
Delphi-Quellcode:
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;
wenn ich eigenschaften der klasse aufrufe ist alles bestens, wenn ich auf fclient zugreifen möchte bekomme ich einen fehler :gruebel:
hat das was mit dem pointer zu tun?

//edit
bekomme auch einen EOSError code 5

Jackie1983 11. Mär 2008 19:54

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:

Apollonius 11. Mär 2008 20:14

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.

Thomas83 12. Mär 2008 08:34

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