AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Datenstrukturproblem: Thread zur Runtime auswählen
Thema durchsuchen
Ansicht
Themen-Optionen

Datenstrukturproblem: Thread zur Runtime auswählen

Ein Thema von iphi · begonnen am 25. Nov 2011 · letzter Beitrag vom 25. Nov 2011
Antwort Antwort
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

Datenstrukturproblem: Thread zur Runtime auswählen

  Alt 25. Nov 2011, 19:13
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Datenstrukturproblem: Thread zur Runtime auswählen

  Alt 25. Nov 2011, 19:37
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. ...
...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#3

AW: Datenstrukturproblem: Thread zur Runtime auswählen

  Alt 25. Nov 2011, 19:46
Prima, danke für die Nachhilfestunde!
Genau sach so einem Konstrukt hab ich gesucht
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#4

AW: Datenstrukturproblem: Thread zur Runtime auswählen

  Alt 25. Nov 2011, 20:08
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Datenstrukturproblem: Thread zur Runtime auswählen

  Alt 25. Nov 2011, 23:01
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 09:06 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