Registriert seit: 29. Mai 2002
37.621 Beiträge
Delphi 2006 Professional
|
Re: mehrere funktionsparameter bei beginthread übergeben?
8. Mär 2009, 17:53
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:
(******************************************************************************
* *
* 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.
Parameter auf dem Stack ablegen:
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.
Michael Ein Teil meines Codes würde euch verunsichern.
|
|
Zitat
|