![]() |
non-vcl Thread innerhalb einer Klasse deklarieren
Hallo Community,
Ich stehe gerade vor einem Syntaxproblem (jedenfalls hoffe ich das ganz stark!). Ich möchte eine non-vcl-Thread-Klasse erstellen, die in etwa so aussehen sollte:
Delphi-Quellcode:
BeginThread verlangt eine Variable vom Typ TThreadFunc und genau das ist das Problem. Sobald dummyThread als Bestandteil einer Klasse deklariert wird, ist es keine Variable mehr. Kann mir jemand sagen, ob man dies iwie umgehen kann?
TMyClass = class
private [...] TMyThread = function dummyThread(Ptr: Pointer): DWORD; //funzt so leider nicht myThread: TMyThread; public procedure callThread(); end; [...] function TMyDialog.dummyThread(Ptr: Pointer): DWORD; // dummyThread ist Bestandteil der Klasse TMyDialog begin result := 1; end; procedure TMyDialog.callThread(); begin tHandle := BeginThread([...], @myThread, [...]); tHandle := BeginThread([...], @dummyThread, [...]); // Syntaxfehler! end; mfg Nogge |
Re: non-vcl Thread innerhalb einer Klasse deklarieren
das
Delphi-Quellcode:
ist eine Typdeklaration, keine Variablendeklaration.
TMyThread = function dummyThread(Ptr: Pointer): DWORD;
Entweder so
Delphi-Quellcode:
Oder du willst das anderes erreichen...
TMyClass = class
private [...] type TMyThread = function dummyThread(Ptr: Pointer): DWORD; var myThread: TMyThread; public procedure callThread(); end; /EDIT: Ich sehe gerade, du nutzt Delphi 7, somit würde das nicht funktionieren... |
Re: non-vcl Thread innerhalb einer Klasse deklarieren
Ja, genau - das funktioniert so leider nicht. Gibt's da keine Lösung für ältere Delphiversionen bzw. für Version 7?
|
Re: non-vcl Thread innerhalb einer Klasse deklarieren
Du hast das Problem das ThreadFunc eine einfache Funktion sein muss, und keine Methode.
Du musst also erstmal eine "einfache" Dummy-funktion erstellen und in dem einen Parameter pübergibst du halt einen Pointer auf eine Variable TMethod (ähnlich, wie es TThread macht) und kannst dann die Thread-Methode aufrufen. |
Re: non-vcl Thread innerhalb einer Klasse deklarieren
Damit habe ich mich gerade gestern erst auseinandergesetzt:
![]() Das funktioniert natürlich nicht nur mit Callback-Funktionen. |
Re: non-vcl Thread innerhalb einer Klasse deklarieren
Das funktioiert doch aber nur, wenn ich den durch getmem angeforderten Speicherbereich auch ausführen darf Luckie. Und wann gibts du den Speicher wieder frei?
Edit: Ich dachte doch eher an sowas (habs jetzt nicht getestet):
Delphi-Quellcode:
Naja, irgendwie so halt.function threaddispatcher(Method:ppointer):integer;stdcall; var ThreadProc:function:integer of object; begin ThreadProc:=Method^; freemem(Method,8); result:=ThreadProc; end; //... var p:pointer; getmem(p,8); move(@TMyDialog.dummyThread,p^,8); Beginthread(...,@threaddispatcher,...,p,...); |
Re: non-vcl Thread innerhalb einer Klasse deklarieren
Freigeben tue ich den Speicher wieder im Destruktor der Klasse (siehe dazu die Demo).
|
Re: non-vcl Thread innerhalb einer Klasse deklarieren
Na gut, aber ich dachte mit getmem angeforderten Speicher kann man nicht ausführen. Da müsste man ja noch ein virtualprotect vorbeischicken.
Edit: Aber funktioniert ja :gruebel: |
Re: non-vcl Thread innerhalb einer Klasse deklarieren
Schon mal vielen Dank im Voraus, Lucky!
Allerdings bedarf es für mich (und best auch einigen anderen, die sich näher für deine Lösung interessieren) einer detailierteren Erklärung: Zitat:
2. "Aufruf der Methode" == Adresse der Methode? Seltsam, denn ich dachte, dass der erste Zeiger auf den Code bereits dies symbolisiert. 3. Ein Funktionszeiger einer Callback-Funktion ist also ein "erweiterter" Zeiger einer Methode? 4. Wieso hast du in deinem asm-Code alle Instruktionen mit mov-Instruktionen ersetzt? P.S. Du hast da zwei Rechtschreibfehler eingebaut: Zitat:
|
Re: non-vcl Thread innerhalb einer Klasse deklarieren
Also bei mir funktioniert es. Allerdings, ob es das bei Prozessoren auch tut, die die verhindern könne, dass Code im Datenbereich ausgeführt wird, müsste man noch mal gucken. Und unter Vista ist es noch nicht getestet.
Wie würde denn dein Code mit VirtualProtect aussehen? @Nogge: Den Code habe ich von den Schweizern übernommen. Zu dem ASM-teil wollte ich sowieso selber noch ein paar Verständnisfragen stellen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 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 by Thomas Breitkreuz