Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Problem: Update in Thread (https://www.delphipraxis.net/178669-problem-update-thread.html)

TRomano 20. Jan 2014 18:34

Datenbank: MySQL • Version: 5.5 • Zugriff über: UniDAC 5.1.4

Problem: Update in Thread
 
Hallo zusammen,

bei mir tritt ein seltsames Verhalten auf, wenn ich ein DB in einem Thread aktualisiere. So lange es String- oder Datumsfelder sind passiert nichts, aber wenn ich JPEG´s von der Platte lade ist die Connection weg (Fehler 10053 Socket error) ...
Ich habe die Connection und die Query im Thread etwas weiter vorn in der Execute-Method erzeugt. Hier ein Auschnitt, der läuft. Kommentiere ich das ...LoadfromFile8fFileName) wieder ein knallt es mit dem Fehler.

Hat einer Idee, was dort schief läuft ?

Delphi-Quellcode:
    QueryThread.First;
    while (not QueryThread.Eof) and (not Terminated) do begin
      sDateTime := FormatDateTime(cFormatDT,Now);
      fFileName := oFldFile.AsString;
      if FileExists(fFileName)
         then begin
                try
                  QueryThread.Edit;
                  oFldUser.AsString  := fSQLAccount.User;
                  oFldDate.AsDateTime := Now;
//                  oFldBlob.LoadFromFile(fFileName);
                  QueryThread.Post;
                  inc(fThreadData.PictureOkay);
                except
                  on E:Exception do begin
                     inc(fThreadData.PictureFailed);
                     fThreadData.Messages.Add(Format('%s - Fehler beim Schreiben der Tabelle "Pictures": %s',[sDateTime,E.Message]));
                  end;
                end;
              end
         else begin
                inc(fThreadData.PictureFailed);
                fThreadData.Messages.Add(Format('%s - Bilddatei nicht vorhanden: %s',[sDateTime,fFileName]));
              end;
      QueryThread.Next;
      inc(fThreadData.Counter);
      if (fThreadData.Counter mod 10 = 0) then Synchronize(UpdateProgress);
    end;
Gruß Tom

TRomano 20. Jan 2014 19:42

AW: Problem: Update in Thread
 
Kommuniziert das .LoadFromFile() vielleicht über den Haupt-Thread ? Das wäre meine einzige Vermutung, wieso die Connection verloren geht ...

Furtbichler 20. Jan 2014 21:03

AW: Problem: Update in Thread
 
Da dürfte die Gegenstelle den Abbruch verursachen. Meiner Meinung nach ist die Art, wie Du Bilder in der DB speicherst, nicht korrekt. Wenn ich google, sehe ich immer einen TBlobStream, der verwendet wird.

TRomano 20. Jan 2014 21:32

AW: Problem: Update in Thread
 
Es läuft ja so im normalen Haupt-Thread korrekt. Ich werde deine Anmerkung mal im Sourcecode checken ...

Bernhard Geyer 20. Jan 2014 21:32

AW: Problem: Update in Thread
 
Wie groß sind die JPEG-Dateien?

TRomano 20. Jan 2014 21:51

AW: Problem: Update in Thread
 
Ich hatte jetzt nicht die Zeit zu prüfen, ob TBlobField.LoadFromFile(...) alles korrekt händelt, aber TBlobStream stammt noch von der BDE (ihgitt) und verlangt ein BDE-DataSet ... nicht gut ! Ich werde noch einmal den Debugger bemühen.

Furtbichler 20. Jan 2014 22:17

AW: Problem: Update in Thread
 
Zitat:

Zitat von TRomano (Beitrag 1244601)
Ich hatte jetzt nicht die Zeit zu prüfen, ob TBlobField.LoadFromFile(...) alles korrekt händelt, aber TBlobStream stammt noch von der BDE (ihgitt) und verlangt ein BDE-DataSet ... nicht gut ! Ich werde noch einmal den Debugger bemühen.

Auweia. Asche auf mein Haupt.

TRomano 20. Jan 2014 22:18

AW: Problem: Update in Thread
 
Alles zwischen 35 und 400 KB.

TRomano 20. Jan 2014 22:50

AW: Problem: Update in Thread
 
Irgendwo im Datenmodul des jeweiligen Thread fand eine stille Exception statt, die dann wohl wiederum über TWinControl.mainWndProc mit dem Haupt-Thread kommunizierte ... das zerschoss die Connection ! Ich habe jetzt erst einmal die TUniQuery hart verdrahtet, denn irgendwo war wohl ein Fehler im dynamischen Setzen des "SQLUpdate.Text"-Property. Selbst schuld ...
Danke für Eure Mühen !

Gruß Thomas

Sir Rufo 20. Jan 2014 22:55

AW: Problem: Update in Thread
 
Du hast diese Query-Instanz aber schon dynamisch im Thread erstellt (so wie auch die Connection-Instanz)?

TRomano 21. Jan 2014 10:27

AW: Problem: Update in Thread
 
Hallo Sir Rufo !

Ich habe die Instanzen in dem Thread (nicht im Create-Event) über ein Datenmodul erzeugt, welches nicht in der Aopplikation geladen wird. Dann werden die Connection und die jeweilige Query dynamisch (Account-Daten für die Connection, SQL für die Query) gefüllt. Wie gesagt, es funktioniert so lange gut, wie nur (in dem Beispiel) String- oder Datumsfelder gefüllt werden. In der Nacht lief es dann auch irgendwann mal mit den Blobs, aber als ich die MD5-Erzeugung (Hash des Bildes abspeichern) einbaute auch wieder nicht mehr.
jetzt habe ich mich erst einmal entschlossen, die Verarbeitung nicht in einen Thread auszulagern, weil Kunden auf ein Update warten. Dann habe ich die Muße das Ganze in Ruhe zu Checken.

Gruß Thomas

TRomano 21. Jan 2014 10:31

AW: Problem: Update in Thread
 
Nur noch ein Hinweis: ich habe bei UniDAC ein Downgrade auf die Version 5.1.4 machen müssen, weil die neue Version 5.2.5 vom Dezember 2013 massive Probleme bereitete (automatische Erzeugung der Properties SQLInsert, SQLUpdate etc.).

TRomano 23. Jan 2014 11:19

AW: Problem: Update in Thread
 
Problem gefunden: nach einem Update des mySQL-Servers auf die Version 5.6.15 (von 5.5.xxx) läuft die Anwendung rund, auch im Thread.
Vielleicht hätte ich mir die Fehlermeldung genauer ansehen sollen ("Connection wurde vom Hostcomputer zurückgwesetzt ...."), dann hätte ich mir eine Menge Zeit und Nerven gespart !


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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