Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Thread richtig beenden (https://www.delphipraxis.net/185340-thread-richtig-beenden.html)

idefix2 2. Jun 2015 02:12

Thread richtig beenden
 
Was passiert eigentlich (bzw. was muss ich veranlassen, weil es nicht automatisch passiert), wenn die Execute-Methode eines Threads am Ende ist?

Ich möchte das Einscannen von einer Twain-Quelle, das doch eine Weile dauert, in einen extra-Thread verlagern, damit während des Scanvorgangs normal im Programm weitergearbeitet werden kann.
Im Thread wird der Scanvorgang gestartet, die nötigen Infos wie Dateiname etc. werden vorher im Hauptthread erfasst und in Variablen der Thread-Instanz gespeichert, dann wird mittels resume der Thread gestartet).
Irgendwann ist (hoffentlich) die Execute-Methode des Threads am Ende, das Bild ist eingescannt und abgespeichert.
Was muss ich dann noch machen? Geht der Thread dann automatisch in den Status suspended?
Und wie starte ich ihn neu? Einfach mit resume?
Oder muss ich den Thread entsorgen und für einen neuen Scanvorgang eine neuen Instanz erstellen?

himitsu 2. Jun 2015 03:43

AW: Thread richtig beenden
 
IMHO beendet sich der Thread und das wars dann.


Bei Delphi-Referenz durchsuchenTThread.FreeOnTerminate=True gibt sich der TThread selber frei und alle eventuell vorhandenen Referenzen werden ungültig.
Ansonsten muß natürlich Thread.Free aufgerufen werden, wie bei jedem anderem Objekt auch.


Bei Delphi-Referenz durchsuchenTThread.CreateAnonymousThread steht es in der OH.


Und ansonsten Delphi-Referenz durchsuchenTTask.


Zitat:

Und wie starte ich ihn neu? Einfach mit resume?
Warum hast du es nicht einfach mal ausprobiert?



Fazit: Der Thread/Execute darf sich nicht beenden.
Und wenn fertig, wartet er auf die nächste Arbeit und macht da weiter, was du natürlich selber implementieren mußt, aber dafür gibt es geschätzt 2,5 Millionen Tutorials.

Oder neuen Thread erstellen.

Sir Rufo 2. Jun 2015 06:56

AW: Thread richtig beenden
 
Der http://www.delphipraxis.net/185335-b...ab-xe2%5D.html sollte da einfacher für dich sein. Es gibt auch eine Komponente für alles vor XE2.

Mavarik 2. Jun 2015 09:42

AW: Thread richtig beenden
 
Hallo!

Klassisch würde ich sagen, Du erzeugst einen Thread beim Programmstart der auf einen Event warten (bis alle Daten da sind)
Da setzt Du den Event und der Thread läuft los...Wenn "Er" fertig ist ruft er einen Procedure auf und legt sich wieder schlafen.

Da Du ja immer nur ein Dokument gleichzeitig einliest würde ich es so machen... klassisch...

Oder eben einen anonymen Thread da der Threadstart ja sicherlich nicht Zeitkritisch ist... Wird der Thread halt jedes mal neu erzeugt...

Kommt ein bisschen auf die Delphi-Version an...

Mavarik

idefix2 2. Jun 2015 14:47

AW: Thread richtig beenden
 
:thumb:
Danke für die Antworten. Jetzt werde ich mich damit wohl ein bisschen spielen müssen :-D

@Sir Rufo
Mein Delphi 2009 muss esrt noch etwas wachsen. :wink:
Aber ich schau es mir an, vielleicht krieg ich die Komponente ja auch mit Delphi 2009 zum Laufen.

Dejan Vu 2. Jun 2015 19:17

AW: Thread richtig beenden
 
Ist der Bug eigentlich gefixt, der die Anwendung abschmieren lässt, wenn sie beendet wird, während anonyme Threads noch im Hintergrund werkeln?

Sir Rufo 2. Jun 2015 19:28

AW: Thread richtig beenden
 
Nach meiner Erkenntnis mit dem BackgroundWorker, ja (definitiv XE8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:05 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