Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Thread mit Query abbrechen (https://www.delphipraxis.net/10374-thread-mit-query-abbrechen.html)

Tonic1024 17. Okt 2003 09:42


Thread mit Query abbrechen
 
Moin...

Ich habe folgendes verbrochen...

Ich habe eine DLL die die Zugriffsschicht auf meine Datenbank darstellt. Ich binde die DLL dynamisch ein, heisst nicht sofort beim Programmstart sondern immer dann, wenn die Funktion grade benötigt wird. Ich hole allerhand Daten ab, unter Anderem auch ein 2dimensionales Array, dass echt umfanreich ist. Da speziell für dieses Array eine Übertragungszeit (Netzwerkbedingt) von bis zu eineinhalb Minuten erfordelich ist lasse ich die Abfrage in einem Thread laufen.

Wie einige ungeduldige User nun mal so sind, möchten sie natürlich einen Abbrechen-Butten haben (ist ja auch sinnvoll). Ich habe daher einfach mal probiert den Thread mit Suspend und Terminate zu beenden. Klappt auch wunderbar.

Nun mein Problem. Wenn ich jetzt eine neue Abfrage starte läuft der Tread nicht mehr an. Ich vermute, dass der Zwangsabbruch des Zugriffs über die DLL jede Menge Datenmüll erzeugt. Aber wie kann ich die DLL kontrolliert vorzeitig beenden und aufräumen?

Kann ich überhaupt zur selben Zeit ein zweites Mal auf die DLL Zugreifen, und dort eine Art Flag kippen, dass sagt "Halt, Stop - Aufhören"? Ich habe in der DLL mal einen Datensatz-Zähler mitlaufenlassen und versucht diesen mit einem Zweiten Zugriff - also als der Erste noch lief - abzufragen, aber da kam nur Datenmüll raus.

Für Hinweise - Ich will keinen fertigen Code - währe ich echt dankbar...

Bis denne...

OLLI_T 17. Okt 2003 10:09

Re: Thread mit Query abbrechen
 
Moin Tonic!

Ich glaub da kann ich Dir helfen. Du darfst auf keinen Fall Suspend aufrufen! Dadurch wird der Thread keinesfalls terminiert sondern nur gestoppt und lässt sich natürlich nie mehr neu starten. Nur Resume würde da helfen. Aber das bringt Dich nicht weiter.
Was Du brauchst ist ein Flag, das Dir kennzeichnet das Feierabend ist. Das kann ganz einfach eine Variable sein, die über ne Schnittstelle an Deine DLL schickst. Diese prüftst Du einfach in Deiner Datensatz-Ausleseschleife zusätzlich ab.

Delphi-Quellcode:
While Not(DM.IBSQL_TH.EOF) And (bCancel=FALSE) Do Begin
  // Datensatz in Array schreiben
  DM.IBSQL_TH.Next;
End;
Also bei mir funzt datt so einwandferi. Allerdings arbeite ich nicht mir ner DLL.

Viel Erfolg

OLLI

Tonic1024 17. Okt 2003 10:22

Re: Thread mit Query abbrechen
 
Moin OLLI...

Das ist genau mein Ansatz gewesen...

Aber ich bekomme den Zugriff auf die DLL nicht gebacken... Ich kann ja nur eine Funktion ausführen die in der DLL hinterlegt ist. wenn ich aber eine Funktion - angenommen es geht - parallel zu einer anderen ausführe, hat diese doch keinen Eifluss auf die andere.

bis denne...

OLLI_T 17. Okt 2003 10:29

Re: Thread mit Query abbrechen
 
Wieso? Du ruftst ne Funktion CancelThread in der Dll auf. Diese setzt die DLL-globale Variable bCancel auf TRUE und alles ist gut. Oder wenn Du mit der Delphi Klasse TThread arbeitest kannst Du dieser zusätzlich Cancel als Property verpassen.
Oder Du nutzt ein Event und ersetzt die Variable bCancel durch WaitForSingleObject. Aber auch hier muss das Handle des Events natürlich in der Thread Func bekannt sein.

Du machst das schon! :zwinker:

APP 17. Okt 2003 10:33

Re: Thread mit Query abbrechen
 
Hallo,
das TThread Objekt von Delphi hat schon eine Abbruchfunktion eingebaut:

Delphi-Quellcode:
Thread1 := TBaseThread.Create(TRUE);
    ...
//Abbruch mit
Thread1.Terminate;
Delphi-Quellcode:
// Im Thread selbst auf Abbruch prüfen...
PROCEDURE TBaseThread.Execute;
BEGIN
  WHILE (NOT Terminated) DO
...

Tonic1024 17. Okt 2003 10:48

Re: Thread mit Query abbrechen
 
Moin...

@APP
Ja, das kenne ich. Aber in Execute steht bei nur eine Anweisung drin nämlich der Zugriff auf die DLL, und die wird nur einmal ausgeführt. Da nutzt mir ein WHILE DO nix... Es ging mir darum, dass ich diese Funktion die da ausgeführt wird unterbreche...

@OLLI
Das mit der Globalen Variable habe ich gestern schon probiert, ging nicht. Heute nochmal probiert und... läuft :lol:
Naja, war schon spät gestern :wink:

Ich vermute, dass es so war:
Ich stelle eine Verbindung zu der DLL her und Kille sie wieder nachdem die Funktion am Ende ist. -> FreeLibrary
Wenn ich eine Globale Variable deklariere, ist der Wert natürlich (kleines Informatiker 1*1) nur solange gültig bis ich die DLL wieder terminiere. Wenn ich sie natürlich danach ein weiteres Mal aufrufe ist sie logischerweise wieder auf Startwert.

Wie gesagt, war echt spät gestern...

Danke für die schnelle Hilfe... :dancer:

Bis denne...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 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-2025 by Thomas Breitkreuz