AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TParallel abbrechen

Ein Thema von DSCHUCH · begonnen am 23. Sep 2014 · letzter Beitrag vom 23. Sep 2014
Antwort Antwort
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

TParallel abbrechen

  Alt 23. Sep 2014, 00:25
Delphi-Version: XE5
Hallo, ich habe mir mal ganz oberflächlich TParallel.For angeschaut. Ich habe auf den ersten Blick nicht gefunden, wie ich das beenden kann.

zB ein Algorithmus, welcher eine Terminierung berechnet. Also NP Vollständig. Wenn ein gewisses Ergebnis erreicht wird, betrachte ich dieses als optimal und möchte alle Threads beenden.

http://docwiki.embarcadero.com/Libra...stem.Threading

Daniel.

Geändert von DSCHUCH (23. Sep 2014 um 00:26 Uhr) Grund: Delphi XE7 Version, kann nicht angewählt werden
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: TParallel abbrechen

  Alt 23. Sep 2014, 00:30
Zum Unterbrechen ist da AFAIK nichts vorgesehen, denn das wird aufgerufen und es geht erst dann weiter, wenn alles durchgeackert ist.

Aber es sollte ja kein Problem sein hier ein zentrale Instanz zu übergeben, die dann sagt, es ist genug und dann hören einfach alle auf (abfragen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: TParallel abbrechen

  Alt 23. Sep 2014, 00:59
Das heißt aber, es würde die Proceduren trotzdem aufrufen, nur das ein Exit am Beginn steht, korrekt?

Ok, also habe ich nichts übersehen wie TParallel.Break oder sowas.

LoopState, LoopResult sowie dieses Iteratorevent muß ich mal nachrecherchieren, dachte evtl geht es damit. Ist auch nur eine hypothetische Frage.

Thx, Daniel.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: TParallel abbrechen

  Alt 23. Sep 2014, 08:08
Du wirst wohl kaum parallel durch endlose Reihen von Einträgen laufen, also ist die Anzahl der Einträge, die mit TParallel.For durchlaufen werden, immer übersichtlich. Wenn also hier jeder Aufruf sofort terminiert, geht das doch schnell.

Was jetzt noch sein könnte, das man durch geschickte Programmierung den Enumerator selbst so konzipiert, das er während des Aufzählens neue Elemente erzeugt. Aber auch hier kann man ggf. abbrechen, d.h. einfach keine neuen Elemente erzeugen.

Ich glaube also, das es sich hierbei um ein eher theoretisches Problem handelt. Dessenungeachtet kann man eine normale For/Foreach-Schleife auch nicht abbrechen.

Hast Du ein konkretes Beispiel, anhand dessen man die Problematik erkennen kann oder sind das nur theoretische Überlegungen?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: TParallel abbrechen

  Alt 23. Sep 2014, 08:24
Mit der Überladung, die beim AIteratorEvent die version mit dem TLoopState übergeben bekommt, kannst du die Schleife abbrechen.
Solltest aber trotzdem innerhalb des Events den übergebenen LoopState überprüfen, denn das Ding läuft auch nach dem abbrechen noch ein bisschen nach.

Also so in etwa:

Delphi-Quellcode:
TParallel.For(1, 100,
  procedure(i: Integer; ls: TParallel.TLoopState)
  begin
    if not ls.Stopped then
    begin
      MachWas;
      if SollAnhalten then
        ls.Stop;
    end;
  end);
Die Möglichkeit, nen CancellationToken zu übergeben wie in .Net wäre sicherlich die schönere Lösung gewesen, aber nunja

Dessenungeachtet kann man eine normale For/Foreach-Schleife auch nicht abbrechen.
Häh? Schonmal was von Break gehört?

Ganz naives Beispiel: mit dem TParallel irgendwas in Dateien suchen und die Dateiliste hab ich schon (bitte keine Diskussion, ob man das anders lösen könnte). Und es gibt in der UI einen Abbrechen Knopf. Tjo, nun sollte man wohl das Dingen abbrechen können oder?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (23. Sep 2014 um 08:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#6

AW: TParallel abbrechen

  Alt 23. Sep 2014, 10:59
Oder du suchst was in der Liste (oder in den Dateien in der Liste) und wenn es gefunden wurde, dann willst du den (ersten) Listeneintrag wissen, womit die weitere Suche nun beendet werden kann.

OK, Suche in Dateien ist etwas blöd (wenn alles auf dem selben Laufwerk), solange es nicht auch noch eine aufwändige Auswertung der Daten gibt, denn sonst würden sich die Dateizugriffe eh nur gegenseitig ausbremsen, außer bei SSDs, die parallelen Zugriff bieten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Sep 2014 um 11:01 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: TParallel abbrechen

  Alt 23. Sep 2014, 11:18
Dessenungeachtet kann man eine normale For/Foreach-Schleife auch nicht abbrechen.
Häh? Schonmal was von Break gehört?
Typisches 'Posten, bevor der Kaffee wirkt'.
  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 09:37 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