Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Proceduren Pointer übergeben (https://www.delphipraxis.net/116174-proceduren-pointer-uebergeben.html)

Desmulator 24. Jun 2008 16:52


Proceduren Pointer übergeben
 
Hallo Leute,
also ich komme mal direkt zur sache: es geht darum, einer ThreadFunktion einen Pointer auf eine andere Funktion zu übergeben, die dann ausgeführt werden soll.

Delphi-Quellcode:
  TThreadInfo = record
    Address : TThreadProcedure;
    Param : Pointer;
  end;
  PThreadInfo = ^TThreadInfo;

...

procedure ThreadProcedure(Info : PThreadInfo); stdcall;
begin
  WriteLn('Hallo Welt!');
  Info.Address(Info.Param);
  FreeMem(Info,SizeOf(TThreadInfo));
  ThreadTerminated := true;
  ThreadReleased := false;
end;

...
  ThreadInfo.Address := ThreadStartAddress;
  ThreadInfo.Param := Param;
  GetMem(ThreadPosition,SizeOf(TThreadInfo));
  Move(ThreadInfo,ThreadPosition^,SizeOf(TThreadInfo));
  ThreadHandle := CreateThread(nil,0, @ThreadProcedure, ThreadPosition, 0, ThreadID);
"Hallo Welt!" wird ausgegeben, dannach erhalte ich eine Zugriffsverletzung. Allerdings stimmt der Wert in Param, wodurch ich davon ausgehe das der Record der richtige ist. Dann wird der Fehler wohl in dem Funkionsaufruf liegen...

Naja bis denne :?

Cyf 24. Jun 2008 17:06

Re: Proceduren Pointer übergeben
 
Du dereferenziert Info nicht.

Desmulator 24. Jun 2008 17:17

Re: Proceduren Pointer übergeben
 
:wall:

himitsu 24. Jun 2008 17:19

Re: Proceduren Pointer übergeben
 
Zitat:

Zitat von Cyf
Du dereferenziert Info nicht.

das sollte Delphi in diesem Fall doch automatisch machen. :gruebel:

Desmulator 24. Jun 2008 17:22

Re: Proceduren Pointer übergeben
 
Ja, davon bin ich auch ausgegangen, allerdings scheint es das nicht gemacht zuhaben, da es nun mit einem kleinen ^ geht.
Ich wäre daher niemals auf die Idee gekommen, dass es nicht derefenziert ist.

Cyf 24. Jun 2008 17:24

Re: Proceduren Pointer übergeben
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Cyf
Du dereferenziert Info nicht.

das sollte Delphi in diesem Fall doch automatisch machen. :gruebel:

Er übergibt nicht ein TThreadInfo sondern einen Zeiger darauf (PThreadInfo), ich bin nicht 100% sicher aber ich denke nur Obekte, Rekords und "var-Funktionsparameter" werden automatisch dereferenziert (eigentlich finde ich auch, dass das schon für Verwirrung genug in Delphi sorgen kann).

[Edit] Hmm... heute hab ichs mit Edits... naja
Bei der Gelegenheit, warum definierst du nicht eifach den Parameter als TThreadInfo, das wäre eigentlich viel einfacher und leichter verständlich, der Pointer auf den Pointer ist da eigentlich volkommen unnötig.

shmia 24. Jun 2008 17:29

Re: Proceduren Pointer übergeben
 
Gibt es einen bestimmten Grund, weshalb du die Klasse TThread nicht benützt?
Ich meine, man kann sich das Leben einfach oder schwer machen.

Desmulator 24. Jun 2008 17:35

Re: Proceduren Pointer übergeben
 
@Cyf :
Wenn ich dich richtig verstanden habe, willst du wissen, warum ich den speicher da reserviere und den Inforecord reinschiebe?
Nun wenn ich den Pointer auf ThreadInfo übergeben würde, wäre dieser genillt, da die Procedure dannach zuende ist, bevor der
Thread überhaupt darauf zugreifen kann.

@shmia : aus spaß an non-VCL und an abneigung gegen Classes und SysUtils und den Rest :wink:

Cyf 24. Jun 2008 17:48

Re: Proceduren Pointer übergeben
 
Eigentlich meinte ich, warum du den Funktionskopf nicht so realisierst und den alten Body beibehälst:

Delphi-Quellcode:
procedure ThreadProcedure(Info : TThreadInfo); stdcall;
Da TThreadInfo für sich bereits ein Pointer ist, er wird lediglich benutzt als wäre er keiner.
Was du machst ist Pointer auf Pointer und das hab ich eigenlich seit Stringtabellen in C nicht mehr gebraucht (oder zumindest so gut wie nie, es gibt ja noch andere Arten mehrdimensionaler arrays). :wink:

SirThornberry 24. Jun 2008 18:02

Re: Proceduren Pointer übergeben
 
TThreadInfo ist doch kein Pointer sondern eine Struktur :gruebel:


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

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