AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Thread mit Query abbrechen
Thema durchsuchen
Ansicht
Themen-Optionen

Thread mit Query abbrechen

Ein Thema von Tonic1024 · begonnen am 17. Okt 2003 · letzter Beitrag vom 17. Okt 2003
Antwort Antwort
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#1

Thread mit Query abbrechen

  Alt 17. Okt 2003, 10:42
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...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#2

Re: Thread mit Query abbrechen

  Alt 17. Okt 2003, 11:09
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
No Pain No Gain!
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#3

Re: Thread mit Query abbrechen

  Alt 17. Okt 2003, 11:22
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...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: Thread mit Query abbrechen

  Alt 17. Okt 2003, 11:29
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!
No Pain No Gain!
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Thread mit Query abbrechen

  Alt 17. Okt 2003, 11:33
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
...
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#6

Re: Thread mit Query abbrechen

  Alt 17. Okt 2003, 11:48
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
Naja, war schon spät gestern

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...

Bis denne...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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