AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Parameterübergabe an VCL-gestarteten Thread
Thema durchsuchen
Ansicht
Themen-Optionen

Parameterübergabe an VCL-gestarteten Thread

Ein Thema von Delphi-Laie · begonnen am 22. Mär 2017 · letzter Beitrag vom 23. Mär 2017
Antwort Antwort
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Parameterübergabe an VCL-gestarteten Thread

  Alt 22. Mär 2017, 14:30
Delphi-Version: 5
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?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Parameterübergabe an VCL-gestarteten Thread

  Alt 22. Mär 2017, 14:48
Bin nicht sicher, was genau jetzt dein Problem ist. Das CreateSuspended kannst du dir allerdings sparen, wenn du die Parameter im Constructor übergibst, da der Thread eh erst nach der kompletten Erstellung (in der AfterConstruction Methode) gestartet wird.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Parameterübergabe an VCL-gestarteten Thread

  Alt 22. Mär 2017, 14:49
Moin,

also ich mache das so, dass ich den TThread suspended erzeuge und Parameter
in Form von Properties setze.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: Parameterübergabe an VCL-gestarteten Thread

  Alt 22. Mär 2017, 15:58
Vielen Dank Euch beiden!

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.

Das CreateSuspended kannst du dir allerdings sparen, wenn du die Parameter im Constructor übergibst, da der Thread eh erst nach der kompletten Erstellung (in der 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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

AW: Parameterübergabe an VCL-gestarteten Thread

  Alt 22. Mär 2017, 16:00
Das CreateSuspended kannst du dir allerdings sparen, wenn du die Parameter im Constructor übergibst, da der Thread eh erst nach der kompletten Erstellung (in der AfterConstruction Methode) gestartet wird.
Delphi 4, das ich derzeit benutze,
In dem Fall bin ich nicht mal von der Korrektheit obiger Aussage überzeugt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Parameterübergabe an VCL-gestarteten Thread

  Alt 22. Mär 2017, 16:09
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!

Das CreateSuspended kannst du dir allerdings sparen, wenn du die Parameter im Constructor übergibst, da der Thread eh erst nach der kompletten Erstellung (in der 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 CreateSuspended Parameter mehr mitgebe und in der Implementierung dann inherited Create(false) verwende.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: Parameterübergabe an VCL-gestarteten Thread

  Alt 22. Mär 2017, 20:41
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.

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.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Parameterübergabe an VCL-gestarteten Thread

  Alt 22. Mär 2017, 21:40
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 inherited Create(false) verwenden und dir den 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 inherited ) und direkt zu Begin der 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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

AW: Parameterübergabe an VCL-gestarteten Thread

  Alt 22. Mär 2017, 22:46
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#10

AW: Parameterübergabe an VCL-gestarteten Thread

  Alt 23. Mär 2017, 09:13
Was heißt einfacher? Viele Wege führen nach Rom.
Einfacher als einen Record zu erstellen und auf diesen zu zeigen, ist es durchaus.

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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 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