Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Kamera App Thread Ftp Uplaod (https://www.delphipraxis.net/210500-kamera-app-thread-ftp-uplaod.html)

oakley 3. Mai 2022 16:07

Kamera App Thread Ftp Uplaod
 
Hallo zusammen,

ich habe eine kleine Kamera App für Android auf Basis der Camera for Android Komponente von Winsoft gemacht.
Nach dem ich ein Bild gemacht habe wird selbiges gespeichert und per FTP auf einen Server geladen.
Funktioniert alles bis auf die Tatsache, dass während der Uploads natürlich die GUI blockiert ist.

Ich kenne mich mit Treading nicht aus und wollte fragen wie ich den FTP Upload in einen geeigneten Thread packe, der die GUI nicht blockiert.

In der Codelib habe ein zwar einen entsprechenden Eintrag gefunden, der aber nicht das gewünschte Ergebnis bringt.

LG

Mirko

Klaus01 3. Mai 2022 17:04

AW: Kamera App Thread Ftp Uplaod
 
Hi Mirko,
muss es FTP sein, da kann jeder Deinen Usernamen mitsamt Passwort im Klartext lesen und auch die Daten lassen sich ohne Probleme mitlesen.
Lässt der Server kein FTPs (FTP over SSL) oder SFTP (SecureFTP) zu?

Grüße
Klaus

TurboMagic 3. Mai 2022 18:44

AW: Kamera App Thread Ftp Uplaod
 
Die Frage, ob es FTP sein muss ist zwar erlaubt, führt aber vom Thema weg.
Man kann das Hochladen per FTP vermutlich in einen Thread packen oder TTask
bemühen, was die Sache evtl. vereinfacht gegenüber der klassischen Thread Programmierung.

Wichtig dabei ist, dass aus einem Thread keine direkten GUI Aufrufe geben darf, da es sonst
irgendwann zufällig Bumm macht!

Ein klassischer Thread wäre so zu programmieren:

Delphi-Quellcode:
uses
  Classes;

type
  TMyThread = class(TThread)
  public
    // Hier muss alles rein, was nebenläufig sein soll
    procedure Execute; override;
  end;

var
  MyThread: TMyThread;

procedure TMyThread.Execute;
begin
  // wenn man was "endlos" im Hintergrund abarbeiten will
  while not Terminated do
  begin
  end;
end;

begin
  MyThread := TMyThread.Create;
  MyThread.FreeOnTerminate := true; // das ggf. im überschriebenen Constructor
                                    // des Threads auf true setzen
  // irgendwas im Vordergrund tun, der Thread wurde bereits gestartet

  // und hier die Schleife im Thread stoppen, der wird dann beendet und freigegeben
  MyThread.Terminate;
Nur so als Beispiel...

Grüße
TurboMagic

oakley 4. Mai 2022 11:50

AW: Kamera App Thread Ftp Uplaod
 
Danke ich denke damit komme ich schonmal weiter.

Das while not Terminated do begin end; wäre dann mein FTP Upload und dann meine Kamera Vorschau darunter nach dem // irgendwas im Vordergrund tun, der Thread wurde bereits gestartet .

Ich versuche das mal.

@Klaus: Ja der Server lässt sftp zu aber testweise habe ich das erstmal deaktiviert weil er mit einen Fehler beim Upload gab "traffic needs to be encrypted" oder sowas.
Die Verbindung wurde aber hergestellt.

LG

Mirko

oakley 4. Mai 2022 17:58

AW: Kamera App Thread Ftp Uplaod
 
Könntest Du mir bitte noch sagen, wie sich das mit dem Execute verhält?

Delphi-Quellcode:
type
  TMyThread = class(TThread)
  public
    ----> Hier habe ich meine FTPUpload Prozedur eingefügt
    procedure FTPUpload;
    procedure Execute; override;
  end;

var
  MyThread: TMyThread;

procedure TMyThread.Execute;
begin
  FTPUpload; //beim Ausführen des Threads soll die Uploadfunktion ausgeführt werden.
  // wenn man was "endlos" im Hintergrund abarbeiten will
  ---- > ich will nichts endlos ausführen
end;
Wenn ich auf den Auslöser drücke wird ein JPG erzeugt (fname = Dateiname):
TFile.WriteAllBytes(TPath.Combine(TPath.GetPublicP ath, fname + '.jpg'), Data);

Und direkt danach habe ich den Code:

Delphi-Quellcode:
  MyThread := TMyThread.Create;
  MyThread.FreeOnTerminate := true;
  MyThread.Terminate;
Wo wird MyThread.Execute aufgerufen? Passiert das automatisch onCreate?

LG

Mirko

Klaus01 5. Mai 2022 07:52

AW: Kamera App Thread Ftp Uplaod
 
.. der Thread startet sofort, wenn der Thread nicht mit dem CreateSuspended = true Parameter aufgerufen wird.

MyThread.Terminate ist meines Wissens nicht notwendig, da der Thread automatisch terminiert wenn der Executeblock abgearbeitet wurde.

Grüße
Klaus

shebang 5. Mai 2022 08:09

AW: Kamera App Thread Ftp Uplaod
 
Wenn du einen ganz einfachen Thread haben möchtest, der nicht viel mehr als den Upload machen solll, dann kannst du auch einen anonymen Thread verwenden:
Delphi-Quellcode:
  TThread.CreateAnonymousThread(procedure
  begin
    FTPUpload;
  end).Start();

TiGü 5. Mai 2022 08:34

AW: Kamera App Thread Ftp Uplaod
 
Wäre ggf. auch eine gute Anwendung für System.Threading?

Delphi-Quellcode:
TTask.Run(
  procedure
  begin
    FTPUpload;
  end);

QuickAndDirty 5. Mai 2022 11:31

AW: Kamera App Thread Ftp Uplaod
 
Ich benutze fast immer die Unit AnonThread.pas aus den Delphi samples. Wie hier beschrieben:
https://community.embarcadero.com/bl...tification-127
Delphi-Quellcode:

  //TAnonymousThread findet sich in anonthread.pas in den Delphi Samples.
  TAnonymousThread<TMyResultRecord>.create(
  Function:TMyResultRecord// Alles was parallel im hintergrund passieren soll
  Begin
    Result.worked := false;
    Result.Filename := LastSavedFile;
    DoFTPUpload(Result.Filename);
    Result.worked := true;
  End
  ,
  Procedure (res:TMyResultRecord)// Was passieren soll wenn der Thread fertig ist
  Begin
    if Res.Worked then
      ShowSyncedMessage('Upload von '+ res.filename+' erfolgreich!' );
  End
  ,

  Procedure (e:Exception) // Was passieren soll wenn der Thread mit einer Exception endete.
  Begin
    ShowSyncedMessage( 'FTP UPLOAD Thread:'+e.message );
  End
  );

TurboMagic 5. Mai 2022 16:22

AW: Kamera App Thread Ftp Uplaod
 
Zitat:

Zitat von Klaus01 (Beitrag 1505442)
.. der Thread startet sofort, wenn der Thread nicht mit dem CreateSuspended = true Parameter aufgerufen wird.

MyThread.Terminate ist meines Wissens nicht notwendig, da der Thread automatisch terminiert wenn der Executeblock abgearbeitet wurde.

Grüße
Klaus

Richtig. Das hab' ich nur zur Illustration eingebaut wie man was länger laufendes mit Schleife im Thread behandeln kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr.
Seite 1 von 2  1 2      

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