![]() |
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:
Und zwar wird mir "TFNThreadStartRoutine(@ThreadCallback)" angezeigt mit der Meldung "Variable" erforderlich .. ich vermute mal ThreadCallback darf keine Funktion eines Objektes sein ..
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; 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? |
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; |
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)
|
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.
|
Re: nonVCL Thread Klasse: Probleme mit der Deklaration
BeginThread ist aber wenn ich nicht irre in der SysUtils Unit deklariert, oder?
|
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
|
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 01:19 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