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
Antwort Antwort
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Verhindern, dass ein Thread zwei mal gestartet wird?

  Alt 23. Jun 2007, 15:53
Hallo!

ich habe ein Thread erstellt und eine globale Variable, die eine Instance dieser Threads ist. Eine Funktion erstellt bei Bedarf diesen global deklarierten Thread, der die Daten bearbeitet und dann terminiert. Wie kann ich überprüfen, on der Thread bereits läuft, bevor ich einen neuen Thread erstelle?
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

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

  Alt 23. Jun 2007, 15:55
Du könntest die Variable als "= nil" deklarieren und später beim erstellen auf nil prüfen...
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 23. Jun 2007, 15:55
Hi,

Du könntest beim Start des Programmes und nach dem Durchlauf des Threads die Variable auf nil setzen und in Deiner Funktion darauf prüfen und den Thread nur erstellen, falls die Variable = nil ist.

Jedoch solltest Du dir das mit der "globalen Variable" überlegen, das ist nicht unbedingt der beste Stil. Eventuell reicht ja schon wenn Du die Variable in den Public / Private Abschnitt Deines Formulares oder der entsprechenden Klasse packen...

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#4

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

  Alt 23. Jun 2007, 17:22
Darf ich im Thread, z.B. in der Destroy-procedure die Variable, die auf diesen Thread zuweist, auf nil setzen? Geht das?
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

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

  Alt 23. Jun 2007, 17:30
Natürlich geht das Dann solltest du aber sicher sein, dass zu diesem Zeitpunkt kein anderer Thread auf diese Variable zufreift.
  Mit Zitat antworten Zitat
DelphiManiac

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

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

  Alt 23. Jun 2007, 18:22
Mir fällt da Singleton Pattern ein:

Hier geht es eigentlich darum, dass du nur eine Instanz/Objekt deiner Klasse erzeugen kannst / darfst.

Wäre hier in deinem Fall eigentlich ganz vorteilhaft.
Wie man es macht ist eigentlich ganz einfach,
du musst nur deine Create Methode private machen, und eine eigene Methode zur Erzeugung deiner Instanz bauen,
die dann deine private Create Methode aufruft, wenn das Objekt = NIL, oder halt den Zeiger auf das Objekt,
also die Objektinstanz zurückgibt.

Falls du dazu noch Fragen hast, helfe ich dir gerne.

Gruß
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#7

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

  Alt 24. Jun 2007, 05:21
Zitat von DelphiManiac:
Mir fällt da Singleton Pattern ein:

Hier geht es eigentlich darum, dass du nur eine Instanz/Objekt deiner Klasse erzeugen kannst / darfst.

Wäre hier in deinem Fall eigentlich ganz vorteilhaft.
Wie man es macht ist eigentlich ganz einfach,
du musst nur deine Create Methode private machen, und eine eigene Methode zur Erzeugung deiner Instanz bauen,
die dann deine private Create Methode aufruft, wenn das Objekt = NIL, oder halt den Zeiger auf das Objekt,
also die Objektinstanz zurückgibt.

Falls du dazu noch Fragen hast, helfe ich dir gerne.

Gruß
Das würde mich interessieren. Zum Beispiel, ich habe ein Thread und möchte, dass ständig eine (und nur eine) Instance dieses Threads läuft. wie mache ich das als Singleton?
  Mit Zitat antworten Zitat
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
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 22:32 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