Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C# Verhalten von Threads (https://www.delphipraxis.net/53443-verhalten-von-threads.html)

faux 16. Sep 2005 18:10


Verhalten von Threads
 
Hallo!

Frage:

Ich habe folgenen Thread (wieder mal, jaja... :P):

Code:
  class SchleifenThread
  {
    public Thread Thread;
    #region Variablendeklaration
    public decimal UpperMaximum = 0;
    public string OutText, OutMD5;
    private char[] valueString;
    private int count = 0;
    private readonly char startChr = 'A', endChr = 'Z';
    #endregion
    public SchleifenThread()
    {
      this.valueString = new char[128];
      for (int i = 0; i < 128; i++)
        this.valueString[i] = this.startChr;
      this.valueString[0]--;
      this.Thread = new Thread(new ThreadStart(Execute));
    }
    void Execute()
    {
      string Output;
      ListViewItem ActualItem;
      MD5 md5 = new MD5CryptoServiceProvider();
      #region Schleife
      [...]
      #endregion
    }
  }
Frage 1:
Wenn ich SchleifenThread.Thread.Start(); mache, startet der Thread - klar. Was passiert, NACHDEM die Prozedurch Execute durchlaufen wurde?

Frage 2:
Wie kann ich den Thread pausieren bzw Stoppen? (von Suspend() und Resume() rät mir VS05 mit einer Warnung ab).

Danke schon mal.
Grüße
Faux

faux 16. Sep 2005 18:41

Re: Verhalten von Threads
 
Ich kappier eines nicht:

Nachdem ich den Thread zum ersten mal Starte, ruft er Execute() auf. Danach setzt er sich auf "Stopped". Wiekann ich ihn jetzt dazu bringen, dass er die Prozedur Execute() nochmal ausführt? :?

Luckie 16. Sep 2005 18:44

Re: Verhalten von Threads
 
In dem du ihn neu startest.

phXql 16. Sep 2005 18:45

Re: Verhalten von Threads
 
Zitat:

Zitat von faux
Ich kappier eines nicht:

Nachdem ich den Thread zum ersten mal Starte, ruft er Execute() auf. Danach setzt er sich auf "Stopped". Wiekann ich ihn jetzt dazu bringen, dass er die Prozedur Execute() nochmal ausführt? :?

in execute eine endlosschleife implementieren.

Delphi-Quellcode:
while(!Terminated)
{

}

faux 16. Sep 2005 18:47

Re: Verhalten von Threads
 
Aus dem ThreadState "Stopped" bekommt man ihn nicht wieder "raus" also in Running?

Khabarakh 16. Sep 2005 18:51

Re: Verhalten von Threads
 
Ohne es ausprobiert zu haben: Einfach nochmal Start aufrufen, das setzt ihn wieder auf "Running".
Was nörgelt VS über Suspend?

faux 16. Sep 2005 18:55

Re: Verhalten von Threads
 
Also wenn er "Stopped" ist, und ich Starte ihn, sagt VS, dass er bereits gestartet ist. Das versuchte ich als erstes. Der einzige State, der ein Start() verlangt ist "Unstarted"....

Warnung vom Visual Studio 2005:
'System.Threading.Thread.Suspend()' is obsolete: 'Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwlink/?linkid=14202'

Khabarakh 16. Sep 2005 19:20

Re: Verhalten von Threads
 
Zitat:

Zitat von faux
Warnung vom Visual Studio 2005:
'System.Threading.Thread.Suspend()' is obsolete: 'Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwlink/?linkid=14202'

Da scheint sich in .NET 2.0 einiges geändert zu haben, ich kann dir deshalb mit 1.1 nicht weiter helfen.

Zum Neustarten: Geht wohl nur durch eine neue Instanz.

faux 16. Sep 2005 19:23

Re: Verhalten von Threads
 
Zitat:

Zitat von Khabarakh
Zum Neustarten: Geht wohl nur durch eine neue Instanz.

Also die Alte verwerfen und eine neue machen?

Dumme Frage:
Wie geht das in .NET?

In Delphi Win32 macht man das mit Free und dann einfach neu Create, aber in .NET gibts IMHO kein Free (oä.) mehr, oder liege ich da falsch?!

Oder kann ich meine Instanz mit einer Zuweisung von "new SchleifenThread();" einfach überschreiben?

Khabarakh 16. Sep 2005 19:31

Re: Verhalten von Threads
 
Ja, sobald keine Referenz auf eine Instanz mehr existiert, schnappt sich der Garbage Collector diese und gibt sie frei. Der GC läuft aber in einem eigenen Thread, er muss nicht sofort die Instanz freigeben, da kann schon noch etwas Zeit vergehen.

[add]
Zitat:

Oder kann ich meine Instanz mit einer Zuweisung von "new SchleifenThread();" einfach überschreiben?
Sollte gehen, der GC kümmert sich um die alte Instanz, da du der Variablen eine neue Referenz zuweist. [/add]


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.
Seite 1 von 2  1 2      

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