Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Variable an Thread übergeben... oder auch nicht!? (https://www.delphipraxis.net/34732-variable-thread-uebergeben-oder-auch-nicht.html)

Meflin 27. Nov 2004 14:30


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:
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;
dann versuche ich die variable so rauszufinden:

Delphi-Quellcode:
function WorkerThreadFunc(P: Pointer): Integer;
var MyID: integer;
    i: integer;
    test: TStringList;
begin
  MyID := Integer(P^);
...
allerdings nimmt dann die variable nie den y wert an, den ich ihr übergeben habe :gruebel:
genau so hat das aber früher (mit d7) funktioniert!?
woran könnte das denn liegen...?

*MFG*

Dax 27. Nov 2004 14:36

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);
...

supermuckl 27. Nov 2004 14:48

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 ?

Meflin 27. Nov 2004 14:49

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...

Dax 27. Nov 2004 14:53

Re: Variable an Thread übergeben... oder auch nicht!?
 
Dann versuchs mal mit MSDN-Library durchsuchenCreateThread (aber nicht vergessen, Delphi-Referenz durchsuchenIsMultiThread auf true zu setzten ;))

Meflin 27. Nov 2004 14:59

Re: Variable an Thread übergeben... oder auch nicht!?
 
immernoch alles nur nicht y :(

Luckie 27. Nov 2004 18:43

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:
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;
Mal so auf die Schnelle ohne Compiler in die Tasten gehauen.

Sprint 27. Nov 2004 20:59

Re: Variable an Thread übergeben... oder auch nicht!?
 
@Meflin: Die Antwort auf dein Problem hat supermuckl schon geschrieben.

Meflin 28. Nov 2004 10:00

Re: Variable an Thread übergeben... oder auch nicht!?
 
Zitat:

Zitat von Sprint
@Meflin: Die Antwort auf dein Problem hat supermuckl schon geschrieben.

irgendein problm damit dass ich den vcl thread nicht verwenden will :gruebel:
steht hier in der windows api oder?

Meflin 28. Nov 2004 14:57

Re: Variable an Thread übergeben... oder auch nicht!?
 
Zitat:

Zitat von Luckie
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:
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 := 'Luckie ist doof.';
  hThread := BeginThread(0, nil, @ThreadFunc, ThreadParams, ... );
  if hThread <> 0 then
  begin
    ...;
    CloseThread(hThrerad);
end;
Mal so auf die Schnelle ohne Compiler in die Tasten gehauen.

also dein tutorial kenn ich. mit dem hab ich mir das ja angeeignet. und letztenendes ist das was ich mache doch genau das gleiche wie du schriebst oder :gruebel: ausser dass es sich bei mir nicht um eine globale variable handelt... muss es das denn?

Luckie 28. Nov 2004 19:54

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.

Meflin 1. Dez 2004 14:23

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

Meflin 1. Dez 2004 14:36

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