![]() |
Variable an Thread übergeben... oder auch nicht!?
Hi,
hab ein kleines problem dabei eine variable an meinen thread zu übergeben. erstellt werden die threads so:
Delphi-Quellcode:
dann versuche ich die variable so rauszufinden:
for y := 0 to Data.SubStrings - 1 do begin
ThreadHandle := BeginThread(nil, 0, TFNThreadStartRoutine(@WorkerThreadFunc), @y, 0, ThreadID); ThreadData[y].ThreadHandle := ThreadHandle; ThreadData[y].ThreadID := y; end;
Delphi-Quellcode:
allerdings nimmt dann die variable nie den y wert an, den ich ihr übergeben habe :gruebel:
function WorkerThreadFunc(P: Pointer): Integer;
var MyID: integer; i: integer; test: TStringList; begin MyID := Integer(P^); ... genau so hat das aber früher (mit d7) funktioniert!? woran könnte das denn liegen...? *MFG* |
Re: Variable an Thread übergeben... oder auch nicht!?
Deklariere die Funktion mal als stdcall lass die Pointer-Casts weg.
Also so:
Delphi-Quellcode:
for y := 0 to Data.SubStrings - 1 do begin
ThreadHandle := BeginThread(nil, 0, @WorkerThreadFunc, y, 0, ThreadID); ThreadData[y].ThreadHandle := ThreadHandle; ThreadData[y].ThreadID := y; end;
Delphi-Quellcode:
function WorkerThreadFunc(P: Pointer): Integer; stdcall;
var MyID: integer; i: integer; test: TStringList; begin MyID := Integer(P); ... |
Re: Variable an Thread übergeben... oder auch nicht!?
mal ganz blöd gefragt.. wieso nimmste nicht die Tthread classe und übergibst die variablen mit einer überschriebenen Create function ?
|
Re: Variable an Thread übergeben... oder auch nicht!?
1. stdcall und beginthread gibt acess violation
2. das @ vor dem y kann man nicht weglassen, der parameter ist ein pointer! ansonsten: gleiches problem: wenn ich das @nicht weglasse aber das ^ kommt auch irgendne mistzahl dabei raus... |
Re: Variable an Thread übergeben... oder auch nicht!?
|
Re: Variable an Thread übergeben... oder auch nicht!?
immernoch alles nur nicht y :(
|
Re: Variable an Thread übergeben... oder auch nicht!?
Guck dir mein Threading Tutorial an. In den Demos zeige ich, wie man Parameter an Threads übergibt.
Bitte nicht CreateThread nutzen. Und die Thread-Funktion nicht als stdcall deklarieren.
Delphi-Quellcode:
Mal so auf die Schnelle ohne Compiler in die Tasten gehauen.
type
TThreadParams = record MyInt: Integer; MyString: String[255]; end; PThreadparams = ^TThreadParams; [..] function ThreadFunc(p: Pointer): Integer; var i: Integer; s: String; begin i := PThreadParams(p)^.MyInt; s := PThreadParams(p)^.MyString; [..] FreeMem(p, sizeof(TThreadParams)); end; [..] procedure Foobar; var ThreadParams: PThreadParams begin GetMem(ThreadParams, sizeof(TThreadParams)); ThreadParams.MyInt := 5; ThreadParams.MyString := 'Meflin ist doof.'; hThread := BeginThread(0, nil, @ThreadFunc, ThreadParams, ... ); if hThread <> 0 then begin ...; CloseThread(hThrerad); end; |
Re: Variable an Thread übergeben... oder auch nicht!?
@Meflin: Die Antwort auf dein Problem hat supermuckl schon geschrieben.
|
Re: Variable an Thread übergeben... oder auch nicht!?
Zitat:
steht hier in der windows api oder? |
Re: Variable an Thread übergeben... oder auch nicht!?
Zitat:
|
Re: Variable an Thread übergeben... oder auch nicht!?
Was ist eine globale Variable? In meinem Beispiel ist nichts global außer dem Typ. Aber das muss er ja sein, da er ja in der Thread-Funktion und in der Routine, die den Thread startet, bekannt sein muss.
|
Re: Variable an Thread übergeben... oder auch nicht!?
ok, ich machs jetzt so wie oben beschrieben.
1. es wird immernoch nicht die zahl übergeben, die ich eigentlich übergebe 2. beim beenden des threads (also vermutlich das freemem) entsteht eine exception :( edit: fehler entdeckt, ein @ zu viel 8) also erledigt |
Re: Variable an Thread übergeben... oder auch nicht!?
also doch noch nicht ganz erledigt:
die exception beim selbstbeenden des threads führt das freemem zu einer exeption EInvalid Pointer Operation oder so ähnlich. wpran könnte das nun wieder liegen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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