Autor Beitrag
Alice
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Di 03.06.08 18:58 
hi,

hier, die dll:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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 Suche im MSDN 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.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.