Autor Beitrag
Schandtäter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 14.12.08 16:09 
Hallo,

ich habe ein Fenster, mit TextBoxes und Labels als auch mit Buttons und einer ProgressBar.

Ich möchte einen Schleifendurchlauf starten, bei dem der Benutzer durch einen Buttonklick des Ende der Schleife bestimmt. Bis zu diesem Event soll die Schleife immer den gleichen Job durchführen.
Damit die Schleife aber beendet werden kann, muss diese Schleife in einen separaten Thread.

Wie kann ich den Thread von "außen" starten, stoppen, pausieren und fortsetzen?

Ich hab jetzt schon einige Tutorials gelesen und einige Snippets versucht zu verstehen, aber irgendwie sind die Lösungen immer auf Spezialfälle zugeschnitten. Ich will einfach was stinknormales. Gut, so wie es geschrieben ist, ist es wahrscheinlich zuviel verlangt.

Euer Schandtäter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 14.12.08 16:29 
Du rufst von außen Terminate auf, und im Thread prüfst du mit Terminated ob die Beendigung von außen angefordert wurde.

Außerdem gibt es noch Suspend, Suspended und Resume.

Mehr zum Thema Threads:
www.delphi-treff.de/...bjectpascal/threads/
www.michael-puff.de/...per/Delphi/Tutorials

// EDIT:
Ach ja: Und wenn du auf deine VCL-Komponenten aus dem Thread heraus zugreifen willst, dann musst du das synchronisieren. Wenn du ein neues Threadobjekt über Datei --> Neu erstellst, steht da näheres.


// EDIT2:
Da hab ich doch wieder übersehen, dass es sich um einen Beitrag im C# Forum handelt. :oops: :oops: :oops:


Zuletzt bearbeitet von jaenicke am So 14.12.08 17:48, insgesamt 2-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: So 14.12.08 17:31 
Hallo und :welcome:

eine einfache Version geht meistens mit einem BackgroundWorker. Da sollte schon das Beispiel in der SDK-Doku/MSDN genügen.

Jürgen
Schandtäter Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 14.12.08 21:47 
Hallo,

ich hab versucht mich da reinzufuchsen. Habe einen Thread zum Laufen bekommen. Allerdings scheitert es bei mir derzeit daran, dass ich den Thread nicht von einem Event aus Starten bzw. Stoppen kann.

Folgenden Code habe ich bisher:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
using System;
using System.Threading;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace Test
{
 public partial class MainForm : Form
 {
  public static int i=0;
  
  public MainForm()
  {
   InitializeComponent();

   Thread DLoop = new Thread(new ThreadStart(download));


   System.Console.ReadLine();
  }
  
  public static void download()
  {
   String mystring = "Thread gestartet ";
   i++;
   mystring += i;
   System.Console.WriteLine(mystring);
  }
    
    void StartbuttonClick(object sender, EventArgs e)
    {
         DLoop.Start(); 
    }
 }
}

Der Code ist von einer anderen Seitie kopiert und etwas angepasst.

So wie ich das sehe, habe ich ein Logikproblem. Irgendwie muss ich doch aus dem Event heraus den Thread steuern können.

EDIT: Ich habs jetzt nochmal probiert, den Konstruktor vor InitializeComponent zu packen, aber klappte auch nicht(gut.. hätte auch keinen Sinn ehrlich gesagt ergeben)... ich hab irgendeine Kinderkrankheit oder sowas... aber ich kriegs einfach nicht hin -.-

Gruß

Schandtäter
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 15.12.08 11:16 
Hallo,

Dein Fehler liegt zunächst einmal an der fehlenden Unterscheidung zwischen Deklaration und Implementation: Die Variable DLoop vom Typ Thread ist im Konstruktor deklariert, also nur dort bekannt. In StartbuttonClick ist DLoop völlig undefiniert. Lösung: Deklaration gehört in die Klasse, Initialisierung in den Konstruktor; dann passt Start in den Click-EventHandler.

Für das Stoppen brauchst Du einen zweiten EventHandler. Anstelle von Stop (was zu erwarten wäre) musst Du offensichtlich Abort verwenden.

Aber ich sagte schon: Zum Einstieg ist der BackgroundWorker viel praktischer.

Jürgen
Schandtäter Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 15.12.08 22:33 
Mag sein das es einfacher ist. Habs grad versucht. Aber irgendwie erschlägt mich die Klasse. Habe mehrere Seiten die es aber so hochtechnisch erklären, dass ich es nicht kapiere.

Scheinbar reicht es nicht die Klasse an die "Thread"-Funktion zu übergeben.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 16.12.08 11:12 
user profile iconSchandtäter hat folgendes geschrieben Zum zitierten Posting springen:
Mag sein das es einfacher ist. Habs grad versucht. Aber irgendwie erschlägt mich die Klasse. Habe mehrere Seiten die es aber so hochtechnisch erklären, dass ich es nicht kapiere.

Ich bin seinerzeit in die SDK-Doku/MSDN gegangen (die ist meiner Ansicht nach sowieso die wichtigste Hilfe), das Beispiel auf der Einstiegsseite zur BackgroundWorker-Klasse genügte vollkommen.

user profile iconSchandtäter hat folgendes geschrieben Zum zitierten Posting springen:
Scheinbar reicht es nicht die Klasse an die "Thread"-Funktion zu übergeben.

Häh? Entweder Thread oder BackgroundWorker, aber kein Gemisch! Wo oder wieso soll eine Klasse an eine Methode übergeben werden? Normalerweise wird umgekehrt ein konkretes Objekt (eine Instanz einer Klasse) an eine Methode übergeben.

Eine Thread-Funktion kenne ich nicht. Thread ist eine Klasse, und unter C# gibt es keine Funktionen, nur Methoden.

Jürgen