AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Verhindern, dass ein Thread zwei mal gestartet wird?
Thema durchsuchen
Ansicht
Themen-Optionen

Verhindern, dass ein Thread zwei mal gestartet wird?

Ein Thema von romber · begonnen am 23. Jun 2007 · letzter Beitrag vom 25. Jun 2007
 
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#8

Re: Verhindern, dass ein Thread zwei mal gestartet wird?

  Alt 25. Jun 2007, 12:17
@romber:

Nunja das Singleton-Muster ist ja dafür da, dass man nur eine Instanz einer Klasse bekommen kann / darf.
Das kann bei manchen modellierten Klassen von Nöten sein.
Du hast ja mit deinem Thread so ein Beispiel, wo wir Singleton anwenden können.
Gut schauen wir uns doch mal einen Standard Thread an:
Delphi-Quellcode:
MyThread = class(TThread)
private
public
  procedure Execute;override;
  constructor Create;
end; // of MyThread = class(TThread)

constructor TMyThread.Create;
begin
  inherited Create(true); // Create Suspended
end; // of constructor TMyThread.Create;
////////////////////////////////////////////////////////////////////////////////
Nun könnten wir X-Objekte erzeugen, über
TMyThread.Create; welches uns ja die Instanz eines Objektes zurück gibt.

Wir müssen aber nun sicherstellen, dass genau das nicht möglich ist.
Es soll nur ein Objekt erstellt werden, und wenn eines erstellt ist, dann soll nur die Referenz des Objektes (das schon
erzeugt worden ist) zurückgegeben werden.

Du hast hier denke ich 2 Möglichkeiten:

1. Du legtst eine globale Variable an (nicht sehr objektorientiert)
2. Du gibst deiner Klasse eine Klassenvariable mit, die im Kontext der Klasse existiert.

Ich würde dir zu 2. raten.

Gut probieren wir es mal aus

Delphi-Quellcode:
MyThread = class(TThread)
private
  constructor Create;
  ??static?? FThreadObject:TThread; // zum speichern der Referenz auf deas "einzigartige" Objekt
public
  procedure Execute;override;
  procedure GetInstance:TMyThread;
end; // of MyThread = class(TThread)

procedure TMyThreadGetInstance:TMyThread;
begin
  if FThreadObject <> NIL then
  begin
    FFThread:=TMyThread.Create;
    result:=FThreadObject;
  end
  else
  begin
    result:=FThreadObject;
  end;
end; // of procedure TMyThreadGetInstance:TMyThread;
///////////////////////////////////////////////////////////////////////////////

constructor TMyThread.Create; // wird versteckt, da jetzt von aussen nicht mehr direkt aufrubar
begin
  inherited Create(true); // Create Suspended
end; // of constructor TMyThread.Create;
////////////////////////////////////////////////////////////////////////////////

Nun kannst du (hoffe ich, da ich es jetzt von C# adaptiert habe, in Delphi könnte es evtl. Unterschiede geben)
so ein Objekt erzeugen

Delphi-Quellcode:
var
ThreadNo1:TMyThread;
ThreadNo2:TMyThread;
ThreadNo3:TMyThread;



...

ThreadNo1:=TMyThread.GetInstance; // Alles der gleiche Thread (bzw das gleiche Objekt der Threadklasse)
ThreadNo2:=TMyThread.GetInstance; // Alles der gleiche Thread (bzw das gleiche Objekt der Threadklasse)
ThreadNo3:=TMyThread.GetInstance; // Alles der gleiche Thread (bzw das gleiche Objekt der Threadklasse)
ThreadNoX:=TMyThread.Create; // Sollte nicht gehen!!!
Hoffe ich konnte dir ein wenig helfen,
falls noch fragen sind, schiess los...

Gruß
DelphiManiac
  Mit Zitat antworten Zitat
 


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 08:57 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 by Thomas Breitkreuz