Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Parameterübergabe an VCL-gestarteten Thread (https://www.delphipraxis.net/192139-parameteruebergabe-vcl-gestarteten-thread.html)

Delphi-Laie 22. Mär 2017 13:30

Delphi-Version: 5

Parameterübergabe an VCL-gestarteten Thread
 
Hallo Delphifreunde!

Zur Zeit beschäftige ich mich damit, einem VCL-gestarteten Thread Parameter zu übergeben. Dabei möchte ich endlich von den globalen Variablen wegkommen.

Luckies Tutorial kenne ich natürlich fast in- und auswendig, aber dort wird dieses Thema allgemein behandelt, nicht auf VCL-gestartete Threads bezogen (sofern ich nicht doch etwas übersah). Auch meine Suche in diesem Forum brachte mich erstmal nicht weiter.

Also, ich dachte es mir so:

Delphi-Quellcode:
type
TestThread=class(TThread)
  private
    l, r: word;
    id: THandle;
    asc: boolean;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended, asc_input: Boolean; links, rechts: word; inputID: THandle);//kein override möglich, da statisch
end;


constructor TestThread.Create(CreateSuspended, asc_input: Boolean; links, rechts: word; inputID: THandle);
begin
inherited create(CreateSuspended);
l := links;
r := rechts;
ID := inputID;
asc := asc_input
end;

//...und weitere Threadsfunktionalität, z.B. die Execute-Methode
Das wird klaglos übersetzt und ergibt auch zur Laufzeit keine wahrnehmbaren Programmfehler, dennoch entspricht das Ergebnis nicht meiner Vorstellung. Deshalb kam mir der Verdacht der ungeeigneten Parameterübergabe. Ist es also möglich, auf diese Weise zusätzliche Parameter (also außer dem CreateSuspended) in den Thread einzuschleusen?

Zacherl 22. Mär 2017 13:48

AW: Parameterübergabe an VCL-gestarteten Thread
 
Bin nicht sicher, was genau jetzt dein Problem ist. Das
Delphi-Quellcode:
CreateSuspended
kannst du dir allerdings sparen, wenn du die Parameter im Constructor übergibst, da der Thread eh erst nach der kompletten Erstellung (in der
Delphi-Quellcode:
AfterConstruction
Methode) gestartet wird.

Christian Seehase 22. Mär 2017 13:49

AW: Parameterübergabe an VCL-gestarteten Thread
 
Moin,

also ich mache das so, dass ich den TThread suspended erzeuge und Parameter
in Form von Properties setze.

Delphi-Laie 22. Mär 2017 14:58

AW: Parameterübergabe an VCL-gestarteten Thread
 
Vielen Dank Euch beiden!

Zitat:

Zitat von Zacherl (Beitrag 1365070)
Bin nicht sicher, was genau jetzt dein Problem ist.

Na, das hatte ich doch in der letzten Frage formuliert: Ob es möglich ist, auf diese Weise dem Thread Parameter zu übergeben. Mir ist allerdings nun ein Weg eingefallen, das zu überprüfen.

Zitat:

Zitat von Zacherl (Beitrag 1365070)
Das
Delphi-Quellcode:
CreateSuspended
kannst du dir allerdings sparen, wenn du die Parameter im Constructor übergibst, da der Thread eh erst nach der kompletten Erstellung (in der
Delphi-Quellcode:
AfterConstruction
Methode) gestartet wird.

Delphi 4, das ich derzeit benutze, akzeptiert kein einfaches "inherited", da muß ein "create" hintendran. Und letzteres erfordert einen Parameter, ohne ist es nicht möglich. Nehme ich doch den, der auch original übergeben wird.

Uwe Raabe 22. Mär 2017 15:00

AW: Parameterübergabe an VCL-gestarteten Thread
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1365085)
Zitat:

Zitat von Zacherl (Beitrag 1365070)
Das
Delphi-Quellcode:
CreateSuspended
kannst du dir allerdings sparen, wenn du die Parameter im Constructor übergibst, da der Thread eh erst nach der kompletten Erstellung (in der
Delphi-Quellcode:
AfterConstruction
Methode) gestartet wird.

Delphi 4, das ich derzeit benutze,

In dem Fall bin ich nicht mal von der Korrektheit obiger Aussage überzeugt.

Zacherl 22. Mär 2017 15:09

AW: Parameterübergabe an VCL-gestarteten Thread
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1365085)
Zitat:

Zitat von Zacherl (Beitrag 1365070)
Bin nicht sicher, was genau jetzt dein Problem ist.

Na, das hatte ich doch in der letzten Frage formuliert: Ob es möglich ist, auf diese Weise dem Thread Parameter zu übergeben.

Ja, definitiv!

Zitat:

Zitat von Delphi-Laie (Beitrag 1365085)
Zitat:

Zitat von Zacherl (Beitrag 1365070)
Das
Delphi-Quellcode:
CreateSuspended
kannst du dir allerdings sparen, wenn du die Parameter im Constructor übergibst, da der Thread eh erst nach der kompletten Erstellung (in der
Delphi-Quellcode:
AfterConstruction
Methode) gestartet wird.

Delphi 4, das ich derzeit benutze, akzeptiert kein einfaches "inherited", da muß ein "create" hintendran. Und letzteres erfordert einen Parameter, ohne ist es nicht möglich. Nehme ich doch den, der auch original übergeben wird.

Oh, hatte in deinem Profil Delphi 10.1 Starter gesehen und versäumt auf die Version im Thread zu achten. In diesem Falle müsstest du selbst überprüfen, ob meine obige Aussage zutrifft. Falls ja, dann gehe ich persönlich so vor, dass ich meinem eigenen Constructor gar keinen
Delphi-Quellcode:
CreateSuspended
Parameter mehr mitgebe und in der Implementierung dann
Delphi-Quellcode:
inherited Create(false)
verwende.

Delphi-Laie 22. Mär 2017 19:41

AW: Parameterübergabe an VCL-gestarteten Thread
 
Zitat:

Zitat von Zacherl (Beitrag 1365094)
Zitat:

Zitat von Delphi-Laie (Beitrag 1365085)
Zitat:

Zitat von Zacherl (Beitrag 1365070)
Bin nicht sicher, was genau jetzt dein Problem ist.

Na, das hatte ich doch in der letzten Frage formuliert: Ob es möglich ist, auf diese Weise dem Thread Parameter zu übergeben.

Ja, definitiv!

Danke, eine solche Antwort schwebte mir vor.

Nach erklecklicher Fummelei mit Stundenüberschreitung kann ich mir diese Frage nun selbst wie folgt beantworten: Mit der Threadklasse von Delphi 2 funktioniert es noch nicht, Delphi 3 lasse ich einmal aus, mit der ab Delphi 4 klappt es jedoch eindeutig. Also ein weitgehendes "ja". Es geht demnach tatsächlich einfacher als von Luckie beschrieben, ich kann es kaum glauben.

Zitat:

Zitat von Zacherl (Beitrag 1365094)
Oh, hatte in deinem Profil Delphi 10.1 Starter gesehen und versäumt auf die Version im Thread zu achten.

Das ist das Maximum, das ich installiert habe, aber derzeit nicht benutze.

Zitat:

Zitat von Uwe Raabe (Beitrag 1365087)
In dem Fall bin ich nicht mal von der Korrektheit obiger Aussage überzeugt.

Gut, gehen wir es der Reihe nach durch:

Lasse ich im Konstruktor diese einleitende "inherited create(CreateSuspended)"-Zeile weg, passiert während des Programmablaufes hinsichtlich neuer Threads gar nichts - nicht verwunderlich.
Schreibe ich nur "inherited", werden inkompatible Typen vom Compiler angemosert.
Bei "inherited create" werden "Nicht genügend wirliche Parameter" angeprangert.
Erst bei "inherited create(CreateSuspended)" ist es dem Compiler recht.

Wie soll man unter solchen Voraussetzungen an dieser Zeile etwas oder diese Zeile insgesamt weglassen können? Dein Zweifel war zumindest nach meiner Beobachtung also berechtigt.

Zacherl 22. Mär 2017 20:40

AW: Parameterübergabe an VCL-gestarteten Thread
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1365132)
Wie soll man unter solchen Voraussetzungen an dieser Zeile etwas oder diese Zeile insgesamt weglassen können? Dein Zweifel war zumindest nach meiner Beobachtung also berechtigt.

Wenn du den Thread eigentlich gar nicht suspended starten willst und meine Aussage von oben stimmt, dann könntest du einfach
Delphi-Quellcode:
inherited Create(false)
verwenden und dir den
Delphi-Quellcode:
CreateSuspended
Parameter in deinem eigenen Constructor sparen.

Müsstest du aber wie gesagt erst verifizieren, ob unter Delphi 4 die Threads tatsächlich auch erst nach Abarbeiten des Constructors gestartet werden. Wenn du keine Sourcen hast, kannst du ja mal sowohl im Constructor (nach dem
Delphi-Quellcode:
inherited
) und direkt zu Begin der
Delphi-Quellcode:
Execute
Methode eine MessageBox einbauen.
Trifft meine Aussage zu, musst du erst die Constructor MessageBox wegklicken, bevor die Execute MessageBox erscheint. Trifft meine Aussage für Delphi 4 nicht zu, werden beide MessageBoxen simultan angezeigt werden.

Luckie 22. Mär 2017 21:46

AW: Parameterübergabe an VCL-gestarteten Thread
 
Was heißt einfacher? Viele Wege führen nach Rom. Und das Kapitel mit dem VCK Thread ist auch eigentlich mehr ein Anhang. Es geht primär um das Erstellen von Threads mit der WinAPI.

Delphi-Laie 23. Mär 2017 08:13

AW: Parameterübergabe an VCL-gestarteten Thread
 
Zitat:

Zitat von Luckie (Beitrag 1365139)
Was heißt einfacher? Viele Wege führen nach Rom.

Einfacher als einen Record zu erstellen und auf diesen zu zeigen, ist es durchaus.

Zitat:

Zitat von Luckie (Beitrag 1365139)
Und das Kapitel mit dem VCK Thread ist auch eigentlich mehr ein Anhang. Es geht primär um das Erstellen von Threads mit der WinAPI.

Ja, diese Schwerpunktsetzung ist an Deinem guten Tutorial durchaus zu erkennen.


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