mehrere funktionsparameter bei beginthread übergeben?
hi,
ich wollte mal fragen wie man mehrere Parameter einer funktion bei aufruf von Beginthread übergibt kleines beispiel: -funktion:
Delphi-Quellcode:
-aufruf:
funktion rechne(a,b:integer):integer;
begin result := a+b; end;
Delphi-Quellcode:
nun versuch ich schon seit einiger zeit herauszufinden wie man aus 2 parametern einen macht aber was nützliches hab ich noch nicht gefunden.
a1s := 2;
b1s := 3; threadhandle:=beginThread(nil,0,TFNThreadStartRoutine(@rechnen),@a1s, 0, threadid); wie kann ich nun auch b1s mit übergeben? |
Re: mehrere funktionsparameter bei beginthread übergeben?
Erstell ein Record mit den Parametern und übergib den Record an die Funktion.
|
Re: mehrere funktionsparameter bei beginthread übergeben?
und wie muss das record aussehen?
Delphi-Quellcode:
so oder muss ich dann die integer weitergeben?
myrecord = record
a: Pinteger; b: Pinteger; |
Re: mehrere funktionsparameter bei beginthread übergeben?
Ganz normal. Du übergibst dann den Zeiger auf den Record. Siehe auch mein Threading Tutorial: http://delphitutorials.michael-puff.de
Parameter auf dem Heap ablegen:
Delphi-Quellcode:
Parameter auf dem Stack ablegen:
(******************************************************************************
* * * Project: Thread Programmierung unter Windows mit Delphi * * Paramter-Demo * * * * Copyright (c) Michael Puff [url]http://www.michael-puff.de[/url] * * * ******************************************************************************) program ParameterHeap; {$APPTYPE CONSOLE} uses Windows; type TThreadParams = packed record Number: Integer; Text: string; end; PThreadParams = ^TThreadParams; function IntToStr(Int: integer): string; begin Str(Int, result); end; function ThreadFunc(tp: PThreadParams): Integer; var Number : Integer; Text : string; s : string; begin // Parameter lokalen Variablen zuweisen. Number := PThreadParams(tp)^.Number; Text := PThreadParams(tp)^.Text; s := 'Zahl: ' + IntToStr(Number) + #13#10 + 'Text: ' + Text; // ExitCode enthält Rückgabewert der Messagebox. Result := MessageBox(0, PChar(s), 'Thread', MB_YESNO or MB_ICONINFORMATION); // Reservierten Speicher für Parameter wieder freigeben. Dispose(tp); end; procedure RunThread; var tp : PThreadParams; Thread : THandle; ThreadID : Cardinal; ExitCode : Cardinal; begin // Speicher für Struktur reservieren. New(tp); // Daten den feldern der Struktur zuweisen. tp.Number := 42; tp.Text := 'Die Antwort.'; // Thread erzeugen. Thread := BeginThread(nil, 0, @ThreadFunc, tp, 0, ThreadID); // Auf Beendigung des Threads warten. WaitForSingleObject(Thread, INFINITE); // Rückgabewert ermitteln... GetExitCodeThread(Thread, ExitCode); // ...und auswerten. case ExitCode of IDYES: Writeln('Benutzer hat "Ja" angeklickt.'); IDNO: Writeln('Benutzer hat "Nein" angeklickt.'); end; // Thread-Handle schliessen udn somit das Thread-Objekt zerstören. CloseHandle(Thread); end; begin RunThread; Readln; end.
Delphi-Quellcode:
(******************************************************************************
* * * Project: Thread Programmierung unter Windows mit Delphi * * Paramter-Demo * * * * Copyright (c) Michael Puff [url]http://www.michael-puff.de[/url] * * * ******************************************************************************) program ParameterStack; {$APPTYPE CONSOLE} uses Windows; type TThreadParams = packed record Number: Integer; Text: string; end; PThreadParams = ^TThreadParams; function IntToStr(Int: integer): string; begin Str(Int, result); end; function ThreadFunc(tp: PThreadParams): Integer; var Number : Integer; Text : string; s : string; begin Number := PThreadParams(tp)^.Number; Text := PThreadParams(tp)^.Text; s := 'Zahl: ' + IntToStr(Number) + #13#10 + 'Text: ' + Text; Result := MessageBox(0, PChar(s), 'Thread', MB_YESNO or MB_ICONINFORMATION); end; procedure RunThread; var tp : TThreadParams; Thread : THandle; ThreadID : Cardinal; ExitCode : Cardinal; begin tp.Number := 42; tp.Text := 'Die Antwort.'; Thread := BeginThread(nil, 0, @ThreadFunc, @tp, 0, ThreadID); WaitForSingleObject(Thread, INFINITE); GetExitCodeThread(Thread, ExitCode); case ExitCode of IDYES: Writeln('Benutzer hat "Ja" angeklickt.'); IDNO: Writeln('Benutzer hat "Nein" angeklickt.'); end; CloseHandle(Thread); end; begin RunThread; Readln; end. |
Re: mehrere funktionsparameter bei beginthread übergeben?
Die zweite Möglichkeit funktioniert aber nur, wenn man tatsächlich in der selben Routine auf die Beendigung des Threads wartet. Das dürfte recht selten vorkommen.
|
Re: mehrere funktionsparameter bei beginthread übergeben?
Logisch. Da beim Verlassen der Routine die lokalen Variablen ungültig werden. Aber es geht. :warn: :mrgreen:
|
Re: mehrere funktionsparameter bei beginthread übergeben?
Dass du das weißt, war mir klar. Das war nur als Hinweis für den unbedarften Leser gedacht.
|
Re: mehrere funktionsparameter bei beginthread übergeben?
danke das hab ich denke ich mal verstanden
jetzt muss ichs nur noch auf meine: "pointer auf ein array von records die aus pointern auf array von zahlen bestehen" variante umwandeln^^ und nachdem ich das gesachafft hab muss ich rausfinden warum ich zugriffsverletzungen bekomme wenn ich die zahlen verändern will. |
Re: mehrere funktionsparameter bei beginthread übergeben?
statt einem Record könnte man auch ein Objekt übergeben (also die Objektreferenz) ... wollt ich nur mal so erwähnen,
aber das mit dem Record ist wohl gängiger. |
Re: mehrere funktionsparameter bei beginthread übergeben?
Zitat:
Delphi-Quellcode:
type TmyThread=class
private a,b:Integer; public function ThreadFunc:Integer; property ... end; ... //und im Aufruf: myThread:=TmyThread.create; myThread.property:=xyz; BeginThread(nil,0,@TmyThreadClass.ThreadFunc,myThread,0,id); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 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