![]() |
Thread abbrechen
Hallo,
ich komme mit meinem Problem (TBatchMove.Execute abbrechen) nicht so wirklich weiter, deshalb formuliere ich die Sache mal anders.Ich habe einen Thread am laufen, in dem Datensätze aus einer Datenbank (Remote) via ODBC ausgelesen und in eine lokale Datenbank geschrieben werden. Z.Zt. wird nach 50.000 gelesenen Datensätzen geschaut, ob eine Abbruch Bedingung (Terminated) eingetreten ist. Nun soll es aber möglich sein, den Thread zu einer beliebigen Zeit abbrechen zu können. Und das geht leider nicht, da der Thread weiterhin läuft, bis der 50.000 Datensatz erreicht wurde. TBatchMove kann man wohl nicht beenden, aber es gibt doch sicher die Möglichkeit den Thread so zu terminieren, das er beendet wird. Inkonsistente Daten sind dabei kein Problem, werden in kauf genommen. Gruß Jacki |
Re: Thread abbrechen
warum kannst du den Thread nicht beenden? Ruf doch TThread.Terminate auf. Im Thread prüfst du denn ob Terminated True ist und brichst dann ab.
Delphi-Quellcode:
procedure TMyThread.Execute;
begin ...; while not EOF() or not Terminated do begin ...; end; ...; end; |
Re: Thread abbrechen
Hallo,
genau so mache ich es ja. Ich habe eine TBatchMove Komponete im Einsatz, die mir jeweils 50.000 Datensätze von einer DB in die andere DB kopiert. Diese Aktion kann ich jedoch nicht abbrechen. Ich habe mir z.Zt so geholfen, das ich nach dem 50.000ten Datensatz Terminated überprüpfe.
Code:
Ich wüder jedoch lieber den Thread auf einem Schlag beenden wollen.
while (not Terminated) do begin
BatchMove1.Execute; end; Gruß Jacki :( |
Re: Thread abbrechen
dann schreib im Hauptprogramm beim OnClick des Abbrechen Buttons
Delphi-Quellcode:
der schmeisst den Thread ohne Rückfrage aus dem Speicher. Das ist eine ziemlich radikale Methode wohlgemerkt.
TerminateThread(<Handle des Threads>);
btw. bei <Handle des Threads> kannst du, falls du VCL Threads verwendest, über die Instanz des von TThread abgeleiteten Objektes an die Eigenschaft Handle rankommen (TThread.Handle); mfG mirage228 |
Re: Thread abbrechen
Aber das ist wirklich die radikale Holzhammermethode. Besser ist es immer den Thread sich selbst beenden lassen. Aber so wie es aussieht kehrt dein BatchMove.Execute nicht vorher zurück. Also wirst du keine andere Chance haben.
|
Re: Thread abbrechen
Hallo Jacki O,
wie schon einmal vorgeschlagen, solltest du in diesem Fall das BatchMove ersetzen durch eine Schleife, in der du die Daten einzeln einfügst, die kannst du nach jedem "Post"-Befehl verlassen. Dazu benutzt du Luckies Schleife. |
Re: Thread abbrechen
Morgen,
ich hatte gehofft, das man den Thread einfach nur beenden kann. Ich wollte meinen Quellcode nicht neu stricken :coder: , werde das aber wohl nun doch tun. Also vielen, vielen Dank für die Tips. Gruß Jacki |
Re: Thread abbrechen
Hi,
ich habe nun alles umgebaut, soll heissen die BatchMove Geschichte ist raus und eine Query hinein gkommen. Nun kommt eine neue Frage auf. Das öffnen der Quelldatenbank dauert ziemlich lange. Ich lasse mir mittels SQL die Datensätze einer bestimmten Stunde anzeigen. Es gibt keine Komponenten zur Anzeige der Datensätze, es werden lediglich die Datensätze in eine lokale DB kopiert. Innerhalb einer Schleife, die bei EOF oder Terminated abbricht. Kann man da irgend etwas in Punkto Geschwindigkeit machen ? Denn so habe ich ja das gleiche Problem wie mit der BatchMove Komponente. Solange die Query mit dem connect'en beschäftigt ist (dauert ca 2 Minuten) kann ich den Thread, in der die Sache abläuft, auch nicht beenden. Irgend eine Idee ? :?: Dank im voraus... Jacki |
Re: Thread abbrechen
Zitat:
Vielleicht können die DB-Profis hier ja einiges Optimieren... |
Re: Thread abbrechen
Hi,
Zitat:
Code:
:( <=- Jacki
select * from MyBase M
where M."DATE" >= '22.10.2003 12:00:00' and M."DATE" < '22.10.2003 12:59:59' |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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