Zitat von
SebE:
Aufruf des Threads:
Delphi-Quellcode:
var
i: DWORD;
begin
i := 5;
fMainThread := CreateThread(nil, 0, @fRunProc, @i, 0, fMainThreadID) //Übergebe ich "i" richtig?
...
i wird theoretisch richtig übergeben - allerdings gibt es da ein Problem: i liegt auf dem Stack, dieser wird jedoch beim Verlassen der Funktion wieder abgeräumt und der Speicherbereich anderweitig wieder verwendet - sprich: der Wert von i kann sich dadurch verändern, bzw. zum Zeitpunkt des Anlaufens vom Thread ist nicht garantiert, dass i noch so ist, wie es zum Zeitpunkt von CreateThread war..... besser also: für i auf dem Heap Speicher allozieren, und diesen Pointer an den Thread übergeben, welcher dann nach Gebrauch den Speicher wieder freigibt (var i : pdword; begin new(i); i^:=5; ..... dispose(i); )
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 von
SebE:
Meine "Thread-Routine":
Delphi-Quellcode:
procedure <Objektname>._run(const t: pointer);
var
thread: DWORD;
threadID: DWORD;
begin
writeln('>>', DWORD(t), '<<'); //<-- es wird "0" ausgegeben!
...
end;
sie oben, plus: mit DWORD(t) greifst du auf die Adresse des Pointers zu, nicht auf den Speicher, auf den er zeigt... richtig dereferenziert wird mit: PDWORD(t)^ oder auch DWORD(t^)