Einzelnen Beitrag anzeigen

DelphiManiac

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

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

  Alt 25. Jun 2007, 11: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