![]() |
Threads Parameter
Hallo,
ich habe ein Problem mit BeginThread(), vielleicht kannt mir jemand helfen. Nun, ich starte ein Thread mit BeginThread(), zu veranschaulichung ein stückchen Code:
Delphi-Quellcode:
Die Funktion für die Threads sieht folgendermaßen aus:
TParamRecord = record
Nr : Integer; end; //[.....] procedure TForm1.Button1Click(Sender: TObject); var id : LongWord; Params: TParamRecord; begin for I := 1 to 50 do begin Params.Nr = I; BeginThread(nil, 0, Addr(StarThread), Addr(Params), 0, id); end; end;
Delphi-Quellcode:
Nun gut, dass Problem ist, dass der Wert Params.Nr in dem Thread immer eine ganz komische Zahl ist.
function StarThread(Paramter: Pointer): Integer;
var Params : ^TParamRecord; begin Params := Paramter; Form1.Memo1.Lines.add('Angekommen mit '+IntToStr(Params.Nr)); end; Wenn ich die Threads nacheinander starte, dann kommen die Parameter richtig an. Eine Beispiel Ausgabe in dem Memo wäre: Zitat:
Gruss, MArc |
Re: Threads Parameter
Hallo!
1. Es ist zwar nicht der Fehler, aber Du solltest ohne Synchronize nicht auf VCL Komponenten zugreifen 2. Warum leitest Du nicht von TThread ab? |
Re: Threads Parameter
Lösung:
Delphi-Quellcode:
Edit: Mal ne dumme Frage: Für was braucht man 50 Threads? :gruebel:
type
PParamRecord = ^TParamRecord; TParamRecord = packed record Nr : Integer; end; var Params:PParamRecord; // Siehe Begründung von Basilikum function StarThread(Paramter: Pointer): Integer; begin Params:=@Paramter^; Case Params.Nr of 1..50: Juchu! else Schluchz end; end; |
Re: Threads Parameter
@Sunlight7: hä ? wo ist jetzt der entscheidende Unterschied ?
das Problem ist, dass der Record auf dem Stack der Thread-startenden Funktion liegt... je nach Laune des Schedulers kann es nun sein, dass der Thread erst anläuft, wenn die Funktion bereits wieder verlassen wurde (sprich: der Stack wieder abgeräumt ist)... Lösung: Record im Heap deponieren...
Delphi-Quellcode:
PParamRecord = ^TParamRecord;
TParamRecord = record Nr : Integer; end; //[.....] procedure TForm1.Button1Click(Sender: TObject); var id : LongWord; Params: PParamRecord; //*** begin for I := 1 to 50 do begin new(Params);//*** Params^.Nr = I; BeginThread(nil, 0, Addr(StarThread), Params,//*** 0, id); end; end;
Delphi-Quellcode:
function StarThread(Paramter: Pointer): Integer;
var Params : TParamRecord; begin Params := PParamRecord(Paramter)^; //*** Dispose(PParamRecord(Paramter)); //*** Form1.Memo1.Lines.add('Angekommen mit '+IntToStr(Params.Nr)); end; |
Re: Threads Parameter
Zitat:
Edit: Ich lasse mich eines besseren belehren, man kann ja net immer recht haben Edit2: Stimmt, ich hatte die Variable lokal in der Unit :oops: |
Re: Threads Parameter
Hi,
Vielen Dank! Ich habe es zum laufen bekommen. Merci. Gruss, MArc |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 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