AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Variable an Thread übergeben... oder auch nicht!?
Thema durchsuchen
Ansicht
Themen-Optionen

Variable an Thread übergeben... oder auch nicht!?

Ein Thema von Meflin · begonnen am 27. Nov 2004 · letzter Beitrag vom 1. Dez 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#1

Variable an Thread übergeben... oder auch nicht!?

  Alt 27. Nov 2004, 15:30
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
genau so hat das aber früher (mit d7) funktioniert!?
woran könnte das denn liegen...?

*MFG*
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

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

  Alt 27. Nov 2004, 15:36
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);
...
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#3

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

  Alt 27. Nov 2004, 15:48
mal ganz blöd gefragt.. wieso nimmste nicht die Tthread classe und übergibst die variablen mit einer überschriebenen Create function ?
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#4

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

  Alt 27. Nov 2004, 15:49
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...
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

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

  Alt 27. Nov 2004, 15:53
Dann versuchs mal mit MSDN-Library durchsuchenCreateThread (aber nicht vergessen, Delphi-Referenz durchsuchenIsMultiThread auf true zu setzten )
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#6

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

  Alt 27. Nov 2004, 15:59
immernoch alles nur nicht y
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

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

  Alt 27. Nov 2004, 19:43
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#8

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

  Alt 27. Nov 2004, 21:59
@Meflin: Die Antwort auf dein Problem hat supermuckl schon geschrieben.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#9

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

  Alt 28. Nov 2004, 11:00
Zitat von Sprint:
@Meflin: Die Antwort auf dein Problem hat supermuckl schon geschrieben.
irgendein problm damit dass ich den vcl thread nicht verwenden will
steht hier in der windows api oder?
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#10

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

  Alt 28. Nov 2004, 15:57
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 ausser dass es sich bei mir nicht um eine globale variable handelt... muss es das denn?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz