Entwickler-Ecke
Windows API - DLL funktion in threat vorzeitig beenden, abbrechen
Alice - Di 03.06.08 18:58
Titel: DLL funktion in threat vorzeitig beenden, abbrechen
hi,
hier, die dll:
http://www.delphi-forum.de/viewtopic.php?t=83673
die eine zum teil lange berechung durchführt.
wie kann ich diese nun vorzeitg abbrechen?
ich habe versucht das ganze in einen thread zu legen und dann
mit
Thread.Terminate / Thread.Destroy bzw. Thread.Free
was mir aber nicht gelungen ist.
cu
alice
Xentar - Di 03.06.08 19:38
Ich vermute mal, gar nicht.
Die DLL Funktion kehrt wahrscheinlich erst zurück, nachdem die Berechnung abgeschlossen ist. Und wenn dies mal 5 Sekunden dauert.. tja, musst du halt warten.
Der zusätzliche Thread hilft dir nur dabei, dass während dieser Zeit die Oberfläche nicht einfriert.
Lossy eX - Fr 06.06.08 13:25
Das Terminate der Klasse TThread setzt nur eine Variable. Diese muss innerhalb der Executemethode ausgewertet werden. Wenn du in einer Methode steckt klappt das natürlich nicht.
Der Destructor (Destroy = Free) von TThread wartet so lange bis das Execute abgeschlossen ist. Was in deinem Falle aber keinerlei Veränderung zur Folge hätte.
Mit
TERMINATETHREAD kannst du einen Thread abschießen. Ich sage bewusst abschießen. Diese Methode beendet den Thread dort wo er sich gerade befindet. Die Klasse TThread liefert eine Eigenschaft Handle die an diese Methode übergeben werden muss. Anschließend ist der Thread geschickte. Es kann aber dadurch passieren, dass man sich dadurch Speicherleckst oder sonst etwas einfängt, weswegen man auf so etwas normal eher verzichten sollte. Wenn zum Beispiel in der Berechnung selber Speicher alloziiert wurde, dann bleibt er erhalten bis die DLL entladen wird. Aber eine DLL kann nicht nur von einer Anwendung benutzt werden.
Der schönere Weg wäre, dass du es entweder nicht abschießt oder zusätzlich einen Callback reinreichst, der der Methode sagt ob sie sich beenden soll oder nicht. Ich habe gesehen du hast bereits einen ProcessCallback. Einfachste und sauberste Lösung dafür wäre dem ProcessCallback einen Integer als Rückgabewert zu verpassen und bei einem Wert <> von 0 die Berechnung abbrechen zu lassen. Das müsste dann aber innerhalb der DLL passieren. Dann musst du nur noch zusehen wie du da den Wert hinbekommst und gut und alles wird sauber beendet.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!