![]() |
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. ![]() 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] |
Re: Absolue DB - Anwendung hängt trotz Thread Zugriff
Ist Absolute DB überhaupt MultiThreading-Fähig?
|
Re: Absolue DB - Anwendung hängt trotz Thread Zugriff
Ja.
Die Urdemo ist nämlich von dessen Support. |
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.
|
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. |
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: |
Re: Absolue DB - Anwendung hängt trotz Thread Zugriff
In TBlobThread.Execute wird direkt auf Elemente der VCL zugegriffen.
Delphi-Quellcode:
Das ist nicht zulässig und kann sogar zum Absturz der Anwendung führen.
frmMain.Image1.Picture.Bitmap.SaveToStream(BlobStream);
Und so etwas geht im Thread überhaupt nicht:
Delphi-Quellcode:
Ü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.
ShowMessage('SaveRichEditToDB Operation completed');
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. |
Re: Absolute DB - Anwendung hängt trotz Thread Zugriff
Moin !
Ok ich habe nun den Thread umgebaut:
Delphi-Quellcode:
Beim Erzeugen des Threads ist das hinzugekommen:
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;
Delphi-Quellcode:
ThreadData := TMemoryStream.Create;
Delphi-Quellcode:
Und hier das Speichern:
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;
Delphi-Quellcode:
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.
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; |
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. |
Re: Absolute DB - Anwendung hängt trotz Thread Zugriff
Moin !
Meinst du so?
Delphi-Quellcode:
Das klappt auch nicht. Denn noch während er mit dem Post beschäftigt ist hängt es ja.
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; 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. |
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