Delphi-PRAXiS
Seite 1 von 2  1 2      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr.
Seite 1 von 2  1 2      

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