Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

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

Re: mehrere funktionsparameter bei beginthread übergeben?

  Alt 8. Mär 2009, 16: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.
  Mit Zitat antworten Zitat