Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi nonVCL Thread Klasse: Probleme mit der Deklaration (https://www.delphipraxis.net/87946-nonvcl-thread-klasse-probleme-mit-der-deklaration.html)

Zacherl 7. Mär 2007 19:11


nonVCL Thread Klasse: Probleme mit der Deklaration
 
Hi,

ich schreibe an einer Unit, die das TThread Object für nonVCL Programme implementiert. Leider stoße ich schon ziemlich am anfang auf ein Problem:

Delphi-Quellcode:
unit Threads;

interface

uses
  Windows;

type
  TThread = class(TObject)
  private
    FThreadID: DWORD;
    FThreadHandle: THandle;
    function ThreadCallback(Data: Pointer): LongInt; stdcall;
  public
    constructor Create(CreateSuspended: boolean);
    destructor Destroy; override;

  protected
    procedure Execute; virtual;
  end;

implementation

constructor TThread.Create(CreateSuspended: boolean);
begin
  if CreateSuspended then
  begin
    FThreadHandle := CreateThread(nil, 0, TFNThreadStartRoutine(@ThreadCallback), CREATE_SUSPENDED, 0, ThreadID);
  end
    else
  begin
    FThreadHandle := CreateThread(nil, 0, TFNThreadStartRoutine(@ThreadCallback), nil, 0, ThreadID);
  end;
end;

destructor TThread.Destroy;
begin
  //
end;
Und zwar wird mir "TFNThreadStartRoutine(@ThreadCallback)" angezeigt mit der Meldung "Variable" erforderlich .. ich vermute mal ThreadCallback darf keine Funktion eines Objektes sein ..

Nehme ich die Callback Funktion nun aber aus dem Object raus und deklariere sie einfach im implementation Teil, woher soll ich dann wissen von welchem TThread Object ich die Execute Methode aufrufen soll?

Hat jemand eine Lösung für dieses Problem?

Flocke 7. Mär 2007 21:07

Re: nonVCL Thread Klasse: Probleme mit der Deklaration
 
1. Der Parameter CREATE_SUSPENDED steht an der falschen Stelle.
2. Die Thread-Prozedur selbst musst du klassenlos machen.
3. Du solltest "Self" als "lpParameter" hinter der Thread-Startadresse übergeben, denn
4. dann erhält die Thread-Prozedur das Objekt als Parameter und kann damit "Execute" aufrufen.

// Nachtrag

Etwa so:

Delphi-Quellcode:
function ThreadCallback(Data: Pointer): LongInt; stdcall;
begin
  Result := TThread(Data).Execute;
end;

constructor TThread.Create(CreateSuspended: boolean);
const
  SuspOrNot: array [Boolean] of DWORD = ( 0, CREATE_SUSPENDED );
begin
  FThreadHandle := CreateThread(nil, 0, @ThreadCallback, Self, SuspOrNot[CreateSuspended], ThreadID);
end;

Zacherl 7. Mär 2007 21:18

Re: nonVCL Thread Klasse: Probleme mit der Deklaration
 
Ah dankeschön :) So geht es .. (Parameter kamen, weil ich die Funktion grade aus dem Kopf so getippt habe)

Luckie 7. Mär 2007 21:57

Re: nonVCL Thread Klasse: Probleme mit der Deklaration
 
Und statt CreateThread solltest du BeginThread nehmen, da BeginThread automatisch die globale Variable IsMultiThread setzt, um den Heap threadsafe zu machen.

Zacherl 8. Mär 2007 12:39

Re: nonVCL Thread Klasse: Probleme mit der Deklaration
 
BeginThread ist aber wenn ich nicht irre in der SysUtils Unit deklariert, oder?

SirThornberry 8. Mär 2007 12:43

Re: nonVCL Thread Klasse: Probleme mit der Deklaration
 
nein ist es nicht. Die Funktion ist in der Unit "System" declariert und implementiert. Hätte dir aber auch die Hilfe verraten :-D

Zacherl 8. Mär 2007 12:44

Re: nonVCL Thread Klasse: Probleme mit der Deklaration
 
Habs falsch gelesen :wall: :mrgreen: Naja, dann vielen Dank euch!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:38 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