Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Absolute DB - Anwendung hängt trotz Thread Zugriff (https://www.delphipraxis.net/132528-absolute-db-anwendung-haengt-trotz-thread-zugriff.html)

moelski 14. Apr 2009 20:01

Datenbank: Absolute DB • Version: 6.02 • Zugriff über: SQL

Absolute DB - Anwendung hängt trotz Thread Zugriff
 
Moin !

Ich habe da eine kleine Demo Anwendung. Ziel ist es lediglich, Daten mittels Thread in einer Datenbank abzulegen bzw. via Thread die Daten zu lesen. Eben um die Anwendung nicht zu blocken.

Hier ist die Demo mit Quellcode und Video.
http://www.logview.info/Downloads/TestHanging.zip

Grundlegend funzt das ja auch alles ganz gut. Aber es kommt zu Problemen wenn man (während der Thread die Daten in der DB ablegt) im DBGrid oder DB Davigator etwas rumklickt (andere Datensätze selektiert). Nach ca. 8-10 mal rumklicken hängt auf mal die Hauptanwendung so lange bis der Thread beendet ist mit seinem Bild speichern.

Die Bedienung der Demo ist wie folgt:
- "Load Image ->" anklicken
- "Save Image to DB" anklicken
Jetzt fängt ein neuer Thread an, die Daten in die DB zu schaufeln.
So und nun halt am besten im DBGrid ein bisschen auf den IDs rumklicken (erste Spalte). Und wie geschrieben - nach 8-10 mal rumklicken hängt die Anwendung (die Uhr und der Counter in der Caption des Formulars stehen still).
Wenn derThread beendet ist, geht alles wieder gewohnte Bahnen.

Ich habe extra mal ein Video erzeugt weil man das nicht sonderlich gut beschreiben kann... (ist mit in dem File enthalten).

Kann mir das jemand erklären und mir auch ggf. sagen was man da machen kann? Denn ansonsten ist das nur die halbe Miete. Die Daten würden zwar per Thread geschrieben, aber wenn dann die Anwendung später doch wieder hängt ist das irgendwie für die Katz ...

[edit=Admin]Damit der Thread leichter auffindbar ist, Tippfehler im Titel korrigiert. Mfg, Daniel[/edit]

Bernhard Geyer 14. Apr 2009 21:08

Re: Absolue DB - Anwendung hängt trotz Thread Zugriff
 
Ist Absolute DB überhaupt MultiThreading-Fähig?

moelski 14. Apr 2009 21:11

Re: Absolue DB - Anwendung hängt trotz Thread Zugriff
 
Ja.
Die Urdemo ist nämlich von dessen Support.

Bernhard Geyer 14. Apr 2009 21:16

Re: Absolue DB - Anwendung hängt trotz Thread Zugriff
 
Kannst du dem Hersteller dieses Demo zusenden? Dort sind auch nur Menschen am Arbeiten und u.U. liegt ja hier ein Bug der Komponenten vor.

moelski 14. Apr 2009 21:18

Re: Absolue DB - Anwendung hängt trotz Thread Zugriff
 
Habe ich natürlich schon getan.
Ich dachte nur das es ggf. generell ein bekanntes Problem dieser Natur gibt.

Habe aber auch noch kein Feedback vom Hersteller.

moelski 15. Apr 2009 08:28

Re: Absolue DB - Anwendung hängt trotz Thread Zugriff
 
Moin !

So Nachricht vom Hersteller bekommen. Der Spezi ist erst am 20sten April wieder da. Vorher keine Info möglich.

Wenn also hier jemand eine Idee hat was das sein könnte ... :hi:

Blup 16. Apr 2009 11:27

Re: Absolue DB - Anwendung hängt trotz Thread Zugriff
 
In TBlobThread.Execute wird direkt auf Elemente der VCL zugegriffen.
Delphi-Quellcode:
frmMain.Image1.Picture.Bitmap.SaveToStream(BlobStream);
Das ist nicht zulässig und kann sogar zum Absturz der Anwendung führen.
Und so etwas geht im Thread überhaupt nicht:
Delphi-Quellcode:
ShowMessage('SaveRichEditToDB Operation completed');
Übergib dem Thread beim Erzeugen statt dessen einen Stream (z.B. einen TMemoryStream oder TFileStream) der die zu speichernden Daten enthält oder die zu lesenden Daten aufnimmt. Das hat auch den Vorteil, dass die Implementierung im TBlobThread nicht von der Art der Daten abhängt.
Wärend der TBlobThread mit dem Stream arbeitet darf der Hauptthread natürlich nicht auf den Stream zugreifen.
FreeOnTerminate ist auch keine so gute Idee, da eine Überprüfung ob die Aktion noch läuft, so nicht möglich ist.

moelski 16. Apr 2009 12:49

Re: Absolute DB - Anwendung hängt trotz Thread Zugriff
 
Moin !

Ok ich habe nun den Thread umgebaut:
Delphi-Quellcode:
  TBlobThread = class(TThread)
  private
    FOperation : TBlobOperation;
    FSession   : TABSSession;
    FDatabase  : TABSDatabase;
    FTable     : TABSTable;
  protected
    procedure Execute; override;
  public
    ThreadData : TMemoryStream;
    constructor Create(Operation: TBlobOperation);
    destructor Destroy; override;
  end;
Beim Erzeugen des Threads ist das hinzugekommen:
Delphi-Quellcode:
  ThreadData := TMemoryStream.Create;
Delphi-Quellcode:
procedure TfrmMain.Button2Click(Sender: TObject);
var
  BlobThread: TBlobThread;
begin
  BlobThread := TBlobThread.Create(boSavePICTUREToDB);

  // Thread die Daten geben
  BlobThread.ThreadData.Position := 0;
  frmMain.Image1.Picture.Bitmap.SaveToStream(BlobThread.ThreadData);

  BlobThread.Priority := tpLower;
  BlobThread.Resume;
end;
Und hier das Speichern:
Delphi-Quellcode:
      begin
         FTable.Edit;
         try
           BlobStream := FTable.CreateBlobStream(FTable.FieldByName('Picture'),bmWrite);
           ThreadData.SaveToStream(BlobStream);
           ThreadData.Free;
           BlobStream.Free;
           FTable.Post;
         except
           FTable.Cancel;
         end;
      end;
Aber im Ergebnis ändert sich nix. Wenn ich ein bischen in der Oberfläche rumklicke (solange der Thread rennt), dann hängt irgendwann die Hauptanwendung komplett. Und zwar so lange bis das der Thread beendet wurde.

Blup 17. Apr 2009 09:21

Re: Absolute DB - Anwendung hängt trotz Thread Zugriff
 
Eventuell tritt das Problem im Destructor auf, da beim FTable.Free wohl auch automatisch FTable.Close aufgerufen wird.

Versuchsweise die Datenmenge bereits im Execute schließen:
FTable.Close;
FDatabase.Close;

ThreadData würde ich im Destructor freigeben, damit auch im Fehlerfall nichts zurückbleibt.

moelski 17. Apr 2009 10:42

Re: Absolute DB - Anwendung hängt trotz Thread Zugriff
 
Moin !

Meinst du so?
Delphi-Quellcode:
    boSavePICTUREToDB:
      begin
         FTable.Edit;
         try
           BlobStream := FTable.CreateBlobStream(FTable.FieldByName('Picture'),bmWrite);
           ThreadData.SaveToStream(BlobStream);

           ThreadData.Free;
           BlobStream.Free;

           FTable.Post;

           FTable.Close;
           FDatabase.Close;
         except
           FTable.Cancel;
         end;
      end;
Das klappt auch nicht. Denn noch während er mit dem Post beschäftigt ist hängt es ja.
Eben noch mal probiert. Habe bei FTable.Close einen Breakpoint gesetzt. Und er hängt beim Post fest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 Uhr.
Seite 1 von 2  1 2      

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