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 |
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 |
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:
Nur so als Beispiel...
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; Grüße TurboMagic |
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 |
AW: Kamera App Thread Ftp Uplaod
Könntest Du mir bitte noch sagen, wie sich das mit dem Execute verhält?
Delphi-Quellcode:
Wenn ich auf den Auslöser drücke wird ein JPG erzeugt (fname = Dateiname):
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; TFile.WriteAllBytes(TPath.Combine(TPath.GetPublicP ath, fname + '.jpg'), Data); Und direkt danach habe ich den Code:
Delphi-Quellcode:
Wo wird MyThread.Execute aufgerufen? Passiert das automatisch onCreate?
MyThread := TMyThread.Create;
MyThread.FreeOnTerminate := true; MyThread.Terminate; LG Mirko |
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 |
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(); |
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); |
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 ); |
AW: Kamera App Thread Ftp Uplaod
Zitat:
|
AW: Kamera App Thread Ftp Uplaod
Danke für die vielen Anregungen. Ich habe es bis dato einfach hiermit gemacht und es funktioniert wie gewünscht.
Delphi-Quellcode:
Ich wollte den Upload eigentlich in einen Service verlegen, der dann im Hintergrund mitläuft aber unter Android 12 habe ich damit noch ein Problem.
TTask.Run(
procedure begin FTPUpload; end); Die App schließt sich unvermittelt, sobald der Service gestartet werden soll. Irgendwas scheint da generell schlief zu laufen, denn das gleiche macht er auch bei der Notification Demo. LG Mirko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 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