![]() |
Parameterübergabe bei CreateThread
Ich habe ein Objekt, welches einen Thread starten soll.
Delphi-Quellcode:
Typen sind folgendermaßen deklariert:
...
protected procedure _run(const t: pointer); stdcall; public fRunProc: OBJPROC; ...
Delphi-Quellcode:
Konstruktor des Objekts:
type
PROC = procedure; OBJPROC = procedure(const t: pointer) of object; stdcall;
Delphi-Quellcode:
Aufruf des Threads:
constructor <Objektname>._create(myProc: PROC);
begin inherited Create; fRunProc := _run; fProc := @myProc;
Delphi-Quellcode:
Meine "Thread-Routine":
var
i: DWORD; begin i := 5; fMainThread := CreateThread(nil, 0, @fRunProc, @i, 0, fMainThreadID) //Übergebe ich "i" richtig? ...
Delphi-Quellcode:
Wie komme ich an den "richtigen" Wert (5)?
procedure <Objektname>._run(const t: pointer);
var thread: DWORD; threadID: DWORD; begin writeln('>>', DWORD(t), '<<'); //<-- es wird "0" ausgegeben! ... end; |
Re: Parameterübergabe bei CreateThread
Zitat:
weiter verträgt sich ein API-Call nicht mit Object-Procedure-Pointer (Procedure of Object)... diese enthalten implizit das "Self", welches beim Start der Funktion in das Register EAX geladen werden müsste - das wird Windows mit Garantie nicht machen... Du musst also noch eine Wrapper-Schicht mehr einbauen - ein Thread, welcher als Parameter den Parameter (@i) und die gewünschte Methode (@fRunProc) z.B. als Record entgegen nimmt... Zitat:
|
Re: Parameterübergabe bei CreateThread
@Basilikum: Danke für deine Antwort.
Zitat:
Ich schreib mal, was ich geändert hab, damit es der Eine oder Andere verwenden kann, der das gleiche Problem hat:
Delphi-Quellcode:
procedure _run(const param: pointer); stdcall;
var t: <Objektname>; threadID: DWORD; begin t := <Objektname>(PDWORD(param^)); //Hier wird mit t gearbeitet (was übergeben wurde) ... end;
Delphi-Quellcode:
Wie man sieht, funktioniert es auch ohne New/Dispose - war aber trotzdem ein guter Gedanke.
procedure <Objektname>._start;
begin ... fMainThread := CreateThread(nil, 0, @_run, @DWORD(Self), 0, fMainThreadID) //Änderung! Jetzt läuft's :-) end; procedure <Objektname>._stop; begin ... TerminateThread(fMainThreadID, 0) end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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