Einzelnen Beitrag anzeigen

Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#2

Re: Parameterübergabe bei CreateThread

  Alt 20. Mai 2007, 11:38
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^)
  Mit Zitat antworten Zitat