AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Thread beenden durch Button clicked
Thema durchsuchen
Ansicht
Themen-Optionen

Thread beenden durch Button clicked

Ein Thema von smmahaup · begonnen am 10. Okt 2016 · letzter Beitrag vom 11. Okt 2016
Antwort Antwort
Jim Carrey
(Gast)

n/a Beiträge
 
#1

AW: Thread beenden durch Button clicked

  Alt 10. Okt 2016, 16:53
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 DeinThreadObject := TDeinThreadObject.Create; // Thread erzeugen (wie auch immer du das machst, falls anders)
end;
Delphi-Quellcode:
procedure TMeasThread.Execute;
begin
 while not Terminated do // solange der Thread nicht erminiert wurde, führe die Schleife aus
  begin
   Form1.Measure; {Messung}
   Synchronize(WriteToStringgrid); {übertragen der Messwerte};
  end;
end;
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
 DeinThreadObject.Free; // Thread "terminieren"
end;

Geändert von Jim Carrey (10. Okt 2016 um 16:55 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Thread beenden durch Button clicked

  Alt 10. Okt 2016, 17:00
Delphi-Quellcode:
procedure TMeasThread.Execute;
begin
 while not Terminated do // solange der Thread nicht erminiert wurde, führe die Schleife aus
  begin
   Form1.Measure; {Messung}
   Synchronize(WriteToStringgrid); {übertragen der Messwerte};
  end;
end;
Eventuell sollte in die Schleife noch ein Sleep(1) rein damit der Thread die CPU nicht zu 100% auslastet.

Und wie Stahli schon schreibt, solltest du aus dem Thread nicht auf deine Form(klasse) zugreifen. Methoden funktionieren zwar, aber jenachdem was darin mit der GUI passiert, könnte es unschöne Effekte geben. Von daher lager die am Besten auch in den Thread aus. Nur deshalb machst du diesen ja.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#3

AW: Thread beenden durch Button clicked

  Alt 10. Okt 2016, 17:08
Verständnisfrage: wie soll man dann von innerhalb des Threads das StringGrid füllen?

Mit einer ProgressBar würde ich es vielleicht so machen...
- innerhalb des Threads wird eine Variable gesetzt welche auf dem Hauptformular in einem Timer abgefragt wird und die ProgressBar setzt.
Oder so ganz und gar nicht?
Aktuell benutze ich statt des Timers einen zweiten Thread der nur dafür da ist die ProgressBar zu bedienen, insofern sich ein bestimmter Wert geändert hat.

Aber mit einem StringGrid ist das ja nicht so leicht machbar.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Thread beenden durch Button clicked

  Alt 10. Okt 2016, 17:18
Verständnisfrage: wie soll man dann von innerhalb des Threads das StringGrid füllen?

Mit einer ProgressBar würde ich es vielleicht so machen...
- innerhalb des Threads wird eine Variable gesetzt welche auf dem Hauptformular in einem Timer abgefragt wird und die ProgressBar setzt.
Oder so ganz und gar nicht?
Aktuell benutze ich statt des Timers einen zweiten Thread der nur dafür da ist die ProgressBar zu bedienen, insofern sich ein bestimmter Wert geändert hat.

Aber mit einem StringGrid ist das ja nicht so leicht machbar.
Andere Frage: Wieso sollte das nicht funktionieren?

Bei einer Progessbar setzt du die Position auf einen Wert oder rufst Step() auf. Bei einem StringGrid müsstest du nur StringGrid.Cells[0, 0] := 'String'; ausführen. Ist ja im Prinzip das Gleiche.

Nur macht man es nicht. Ich würde aus dem Thread ein Event mit Synchronize feuern, das von der MainForm abonniert wurde, und dann das StringGrid updaten.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Thread beenden durch Button clicked

  Alt 10. Okt 2016, 17:23
Verständnisfrage: wie soll man dann von innerhalb des Threads das StringGrid füllen?
Gar Nicht!

Du kannst z.B. in der Messung einen Ergebnissatz erstellen. Die Messung sendet an den Haupt-Thread eine Nachricht, und dieser holt dann den Ergebnissatz ab und trägt ihn in das Grid ein.
Und wenn es mehr als 1 Ergebnis gibt, dann solltest Du das z.B. mit einer Liste oder einem Array organisieren.


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Thread beenden durch Button clicked

  Alt 10. Okt 2016, 17:40
Grundsätzlich kann man das Grid aus dem Thread heraus befüllen, wenn dies synchronisiert erfolgt. So lange steht halt der Thread.

Wenn man ein Zwischenergebnis schnell in eine Liste wirft, kann der Thread sofort weiter wuseln und das nächste Ergebnis holen.
Der Mainthread kann dann nach und nach ein Ergebnis aus der Liste holen und dieses darstellen.
In dem Fall muss aber die Liste gegen konkurrierende Zugriffe abgesichert werden (z.B. mit CriticalSections) damit der Thread die Liste nicht beschreiben will während der Mainthread einen Eintrag entnimmt und die Liste kürzt. Der Thread könnte dann keinen Eintrag mehr hinter die ermittelte letzte Position hängen, da die inzwischen nicht mehr existiert.

Also ist die ursprüngliche Lösung die einfachere und bessere, sofern diese keine Performanceprobleme mit sich bringt.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Thread beenden durch Button clicked

  Alt 11. Okt 2016, 01:16
Ist eigentlich niemand aufgefallen, dass man mit Form1.Measure; auf das VCL-Formular aus dem Thread zugreift, was man tunlichst unterlassen sollte?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
smmahaup

Registriert seit: 15. Apr 2016
Ort: Kaufbeuren
6 Beiträge
 
#8

AW: Thread beenden durch Button clicked

  Alt 11. Okt 2016, 07:59
Hallo Leute,
vielen Dank für das tolle Feedback.

Ich hatte das mit MyThreadObject.terminate schon ausprobiert. Dabei kommt mir aber eine Fehlermeldung auf 'Cannot terminate an externally thread.'

Bei MyThreadObject.free wird mir eine Access Violation angezeigt.

Ich habe mir eine 'WAIT'-Funktion in meine WriteToStringgrid - Procedure geschrieben, das sollte doch reichen?

Wäre schön wenn wir das noch lösen könnten
Markus
  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 06:13 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