Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Datenstrukturproblem: Thread zur Runtime auswählen (https://www.delphipraxis.net/164706-datenstrukturproblem-thread-zur-runtime-auswaehlen.html)

iphi 25. Nov 2011 18:13

Datenstrukturproblem: Thread zur Runtime auswählen
 
Hallo,

ich habe zwei Varianten eines Threads geschrieben, von denen wahlweise einer ein Problem beackern soll. Mir ist aber unklar, wie ich das datentechnisch strukturieren muss.

Im Prinzip soll das wie folgt funktionieren:
Delphi-Quellcode:
Type
TThread1=class(TThread);
...
TThread2=class(TThread);
...
und im Hauptprogram:
Delphi-Quellcode:
var
MyThread: TThread;
first: boolean;
...
if first then MyThread:=TThread1.Create(Self)
         else MyThread:=TThread2.Create(Self);
...
MyThread. ...
...
TThread1 und TThread2 haben dieselbe Daten- und Methodenstruktur, die aber natürlich über die von TThread hinausgeht. Die Methoden selbst unterscheiden sich natürlich (nicht im Namen und der Deklaration aber im Inhalt).

Mein obiges Beispiel läuft im Prinzip sogar, ich kann aber auf Daten und Methoden, die TThread nicht kennt, nicht zugreifen. Ein Typecast würde den Zugriff zwar ermöglichen, ich weiß aber zur Compilezeit ja noch nicht, ob TThread1 oder TThread2 gewählt wird.

Wie strukturiert man so was?

Sir Rufo 25. Nov 2011 18:37

AW: Datenstrukturproblem: Thread zur Runtime auswählen
 
Am einfachsten geht das mit einem BasisThread:

Delphi-Quellcode:
TMyBaseThread = class( TThread )
public
  procedure TuWas1; virtual; abstract;
  procedure TuWas2; virtual; abstract;
end;

TThread1 = class( TMyBaseThread )
protected
  procedure Execute; override;
public
  procedure TuWas1; override;
  procedure TuWas2; override;
end;

TThread2 = class( TMyBaseThread )
protected
  procedure Execute;
public
  procedure TuWas1; override;
  procedure TuWas2; override;
end;
und nun
Delphi-Quellcode:
var
MyThread: TMyBaseThread;
first: boolean;
...
if first then MyThread:=TThread1.Create(Self)
         else MyThread:=TThread2.Create(Self);
...
MyThread. ...
...

iphi 25. Nov 2011 18:46

AW: Datenstrukturproblem: Thread zur Runtime auswählen
 
Prima, danke für die Nachhilfestunde!
Genau sach so einem Konstrukt hab ich gesucht :-D

iphi 25. Nov 2011 19:08

AW: Datenstrukturproblem: Thread zur Runtime auswählen
 
Noch eine Frage:

Wie verfahre ich mit den Methoden Execute und Destroy im Basisthread? Die sollen ja auch überladen werden. Deklariere ich die auch als virtuell oder lege ich da tatsächlich Methoden an mit inherited drin?

Sir Rufo 25. Nov 2011 22:01

AW: Datenstrukturproblem: Thread zur Runtime auswählen
 
Zitat:

Zitat von iphi (Beitrag 1137893)
Noch eine Frage:

Wie verfahre ich mit den Methoden Execute und Destroy im Basisthread? Die sollen ja auch überladen werden. Deklariere ich die auch als virtuell oder lege ich da tatsächlich Methoden an mit inherited drin?

Deine abgeleiteten Klassen verhalten sich genauso wie die Vorgänger-Klasse zzgl. der Erweiterungen.

Delphi-Quellcode:
TFooBase = class
protected
  procedure BaseVirtual; virtual;
end;

TFooAfterBase = class( TFooBase )
protected
  procedure AfterBaseVirtual; virtual;
end;

TFooKonkret = class( TFooAfterBase )
protected
  // wurde in TFooBase eingeführt
  procedure BaseVirtual; override;
  // wurde in TFooAfterBase eingeführt
  procedure AfterBaseVirtual; override;
end;

procedure TFooBase.BaseVirtual;
begin
  // man kann hier was machen
end;

procedure TFooAfterBase.AfterBaseVirtual;
begin
  // man kann hier was machen
end;

procedure TFooKonkret.BaseVirtual;
begin
  inherited;
  // Irgendwas machen
end;

procedure TFooKonkret.AfterBaseVirtual;
begin
  inherited;
  // irgendwas machen
end;
Es gibt übrigens eine nette Hilfe bei der Implementierung der konkreten Klassen:
Delphi-Quellcode:
type
  TMyThread = class( TThread )
  // Den Cursor unter dieser Kommentar-Zeile platzieren und Strg+Leertaste drücken =8o)
 
  end;


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