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 createThread mit Methode als Parameter (https://www.delphipraxis.net/138695-createthread-mit-methode-als-parameter.html)

SebE 15. Aug 2009 13:32


createThread mit Methode als Parameter
 
Hallo,
ich hab ein rel. simples Problem:

Delphi-Quellcode:
createThread(nil, 0, MachWas, nil, 0, fMainThreadID);
und zwar ist MachWas eine Methode, also keine "normale" Prozedur, welche aber gewünscht ist.

Ich möchte MachWas nicht global deklarieren.
Wie kann ich dieses Problem lösen.

Danke

Apollonius 15. Aug 2009 13:38

Re: createThread mit Methode als Parameter
 
Du hast doch einen Parameter zur freien Verfügung. Da verwendest du dann einfach Pointer(Objekt) und castest in der Thread-Funktion zurück zum Objekttyp und rufst die Methode auf. Alternativ kannst du auch tricksen und die Methode als stdcall oder pascal deklarieren, dann brauchst du keine Helferroutine.

sx2008 15. Aug 2009 13:47

Re: createThread mit Methode als Parameter
 
Wieso leitest du nicht von der Klasse TThread ab?

SebE 15. Aug 2009 20:23

Re: createThread mit Methode als Parameter
 
@Apollonius: mit der "Helfer"-Routine mach ich es ja zur Zeit.
Die ist aber global deklariert - das gefällt mir nicht.
Ich hab schon mit Klassen-Methoden (class procedure MacWas()) gespielt, läuft aber auch nicht (obwohl ich dache, dass wären "normale" Prozeduren)

Wie bekomme ich denn die Addresse einer Methode heraus, mit Pointer(MachWas) kann ich leider nicht casten.

jbg 15. Aug 2009 21:03

Re: createThread mit Methode als Parameter
 
Statt CreateThread solltest du BeginThread benutzen, denn sonst bekommt der Speichermanager nicht mit, dass er jetzt von mehreren Threads aus angesprochen wird.

Apollonius 15. Aug 2009 21:04

Re: createThread mit Methode als Parameter
 
Damit Klassenmethoden sich wie globale Routinen verhalten, musst du ihnen bei der Deklaration noch ein 'static;' mitgeben. Die Bestandteile eines Methodenzeigers erhältst du, indem du nach TMethod castest. Wenn du auf Biegen und Brechen keine Helferfunktion willst, kannst du deine Threadmethode als stdcall oder pascal deklarieren und CreateThread so aufrufen:
Delphi-Quellcode:
CreateThread(nil, 0, TMethod(Methode).Code, TMethod(Methode).Data, 0, ID);
Lass dir nebenbei gesagt sein, dass unter Delphi besser BeginThread statt CreateThread genutzt werden sollte, da dies u.A. dem Speichermanager ermöglicht, sich auf Multithreadbetrieb einzustellen.

sx2008 15. Aug 2009 21:16

Re: createThread mit Methode als Parameter
 
Und wieso leitest du nicht von der Klasse TThread ab?
Warum möchtest du bei Threads auf objektorientierte Programmierung verzichten??

Luckie 15. Aug 2009 21:35

Re: createThread mit Methode als Parameter
 
Oder guck mal hier: http://www.michael-puff.de/Artikel/CallbackMethod.shtml

Apollonius 15. Aug 2009 21:39

Re: createThread mit Methode als Parameter
 
Ist es nicht ein bisschen verschwenderisch, eine ganze Speicherseite für 15 Bytes zu allozieren, wenn Windows schon einen Kontext-Parameter anbietet?

Luckie 15. Aug 2009 21:46

Re: createThread mit Methode als Parameter
 
Ich habe den Code lange nicht mehr angeguckt. Er ist eventuell verbesserungswürdig. Verbesserungsvorschläge nehme ich gerne entgegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 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