|
Registriert seit: 15. Aug 2005 287 Beiträge |
#1
Hallo zusammen,
ich bin gerade dabei eine IOS App zu programmieren, die Daten via Unidac aus einer MariaDB holt und dazu Dateien per FTP Download herunter lädt. FTP Download starte ich in einem sparaten Thread, den Fortschrittsbalken aktualisiere ich per Synchronize. Ich lade zum Einen Dokumente herunter, zum anderen technische Zeichnungen. Der Code ist etwas gekürzt, oberhalb werden noch einige andere Dateien geladen aber entweder bleibt der Thread bei den Dokumenten "hängen", zu mindest zeigt er das nach dem Synchronize in meiner Textbox an. Es kann auch sein, dass er bis zu den Plänen kommt, und dann dort stehen bleibt. Läuft der Thread weiter und die Anzeige wird nicht synchronisiert? Und Teilweise bekomme ich beim Download der Dokumente plötzlich einen weißen Bildschirm angezeigt. Ich habe gerade gesehen, dass der weiße Bildschirm beim Laden der Pläne angezeigt wird (oder danach). Gibt es eigentlich eine verlässiche Methode unter IOS zu prüfen ob eine Internetverbindung verfügbar ist? Der Download soll ja nicht starten wenn man keien Verbindung zum Server hat.
Delphi-Quellcode:
procedure TSingleSyncThread.Execute;
Procedure DownloadFolder(calledfrom, ARemoteFolder, ALocalFolder: string); var SubFolders: TStringList; I: Integer; begin ALocalFolder := IncludeTrailingPathDelimiter(ALocalFolder); ForceDirectories(ALocalFolder); SubFolders := TStringList.Create; try DM1.FTP1.ChangeDir(ARemoteFolder); DM1.FTP1.List; TSyncThread.Synchronize(nil, procedure begin CSITEDETFORM.xpbar.Max := DM1.FTP1.DirectoryListing.Count; CSITEDETFORM.xpbar.Visible := True; end); for I := 0 to DM1.FTP1.DirectoryListing.Count-1 do begin if DM1.FTP1.DirectoryListing[I].ItemType = ditFile then begin if (ExtractFileExt(DM1.FTP1.DirectoryListing[I].FileName) = '.msg') then Continue; TSyncThread.Queue(nil, procedure begin CSITEDETFORM.xpbar.Value := i+1; end); DM1.FTP1.Get(DM1.FTP1.DirectoryListing[I].FileName, ALocalFolder + DM1.FTP1.DirectoryListing[I].FileName, True, false); end else if DM1.FTP1.DirectoryListing[I].ItemType = ditDirectory then begin if (DM1.FTP1.DirectoryListing[I].FileName <> '.') and (DM1.FTP1.DirectoryListing[I].FileName <> '..') then SubFolders.Add(DM1.FTP1.DirectoryListing[I].FileName); CSITEDETFORM.xpbar.Value := i+1; end; end; for I := 0 to SubFolders.Count-1 do begin DownloadFolder(calledfrom, ARemoteFolder + '/' + SubFolders[I], ALocalFolder + SubFolders[I]); end; finally SubFolders.Free; TSyncThread.Queue(nil, procedure begin CSITEDETFORM.xpbar.Visible := false; end); end; end; var ... einige Variablen begin filestosync := TStringlist.Create; try CSITEDETFORM.SYNCBOX.Visible := True; CSITEDETFORM.BTNSYNC.Enabled := false; if not DM1.UniConnection1.Connected then DM1.UniConnection1.Connect; DM1.CSITESYNCQUERY.Close; DM1.CSITESYNCQUERY.SQL.Text := 'SELECT * from documents WHERE DOC_CUSTFURN = ''5'' AND DOC_REFID = ''' + csitetoload + ''';'; DM1.CSITESYNCQUERY.Execute; TSingleSyncThread.Synchronize(nil, procedure begin CSITEDETFORM.SYNCLABEL.Text := 'Dokumente'; end); if DM1.CSITESYNCQUERY.RecordCount > 0 then //if there is data to sync begin sqlstring := 'INSERT INTO documents (DOC_REFID, DOC_CUSTFURN, DOC_FILENAME, DOC_PATH, DOC_REMARK, DOC_ADDEDDATE, DOC_PARENT, DOC_LEVEL, DOC_TYPE, DOC_NODEID, DOC_NEWSCAN) VALUES '; while not DM1.CSITESYNCQUERY.Eof do begin docfilename := StringReplace(DM1.esc(DM1.CSITESYNCQUERY.FieldbyName('DOC_PATH').AsString), '\','/', [rfReplaceAll, rfIgnoreCase]); docfilename := StringReplace(docfilename, '//192.168.100.5/csitestore/docs/', '', [rfReplaceAll, rfIgnoreCase]); sqlstring := sqlstring + '(''' + DM1.CSITESYNCQUERY.FieldbyName('DOC_REFID').AsString + ''', ''' + DM1.CSITESYNCQUERY.FieldbyName('DOC_CUSTFURN').AsString + ''', ''' + DM1.esc(DM1.CSITESYNCQUERY.FieldbyName('DOC_FILENAME').AsString) + ''','+ '''' + docfilename + ''', ''' + DM1.esc(DM1.CSITESYNCQUERY.FieldbyName('DOC_REMARK').AsString) + ''', ''' + DM1.CSITESYNCQUERY.FieldbyName('DOC_ADDEDDATE').AsString + ''',' + '''' + DM1.CSITESYNCQUERY.FieldbyName('DOC_PARENT').AsString + ''', ''' + DM1.CSITESYNCQUERY.FieldbyName('DOC_LEVEL').AsString + ''', '+ '''' + DM1.CSITESYNCQUERY.FieldbyName('DOC_TYPE').AsString + ''', ''' + DM1.CSITESYNCQUERY.FieldbyName('DOC_NODEID').AsString + ''', ''' + DM1.CSITESYNCQUERY.FieldbyName('DOC_NEWSCAN').AsString + '''),'; DM1.CSITESYNCQUERY.Next; end; sqlstring := Copy(sqlstring,1,(Length(sqlstring)-1)); //get rid of the last , DM1.SQLITEQUERY.Close; DM1.SQLITEQUERY.SQL.Text := 'DELETE FROM documents WHERE DOC_REFID = ''' + csitetoload + ''';'; DM1.SQLITEQUERY.Execute; DM1.SQLITEQUERY.Close; DM1.SQLITEQUERY.SQL.Text := sqlstring; DM1.SQLITEQUERY.Execute; ftpdirectory := 'csitestore/docs'; try if not DM1.FTP1.Connected then DM1.FTP1.Connect; try try DM1.FTP1.ChangeDir(ftpdirectory + '/' + csitetoload); TSingleSyncThread.Synchronize(nil, procedure begin if DirectoryExists(TPath.GetTempPath + '/' + csitetoload) then TDirectory.Delete(TPath.GetTempPath + '/' + csitetoload, True); end); DownloadFolder('docs', '/home/' + ftpdirectory + '/' + csitetoload , TPath.GetTempPath + '/' + csitetoload); TSingleSyncThread.Synchronize(nil, procedure begin TDirectory.Copy(TPath.GetTempPath + '/' + csitetoload, csitedocpath + '/' + csitetoload); end); except On E: Exception do begin TThread.Synchronize(nil, procedure begin end); end; end; finally DM1.FTP1.Disconnect; filestosync.clear; end; except On E: Exception do begin TThread.Synchronize(nil, procedure begin CSITEDETFORM.SYNCLABEL.Text := e.Message; end); end; end; end else begin //if there is nothing to sync DM1.SQLITEQUERY.Close; DM1.SQLITEQUERY.SQL.Text := 'DELETE FROM documents WHERE DOC_REFID = ''' + csitetoload + ''';'; DM1.SQLITEQUERY.Execute; end; DM1.CSITESYNCQUERY.Close; DM1.CSITESYNCQUERY.SQL.Text := 'SELECT * from consite_plans WHERE CSITEPLAN_CSITEID = ''' + csitetoload + ''';'; DM1.CSITESYNCQUERY.Execute; if DM1.CSITESYNCQUERY.RecordCount > 0 then //if there is data to sync begin TSingleSyncThread.Synchronize(nil, procedure begin CSITEDETFORM.SYNCLABEL.Text := 'Pläne'; end); sqlstring := 'INSERT INTO consite_plans (CSITEPLAN_CSITEID, CSITEPLAN_PLAN, CSITEPLAN_PLAN_ORIGNAME, CSITEPLAN_DESCRIPTION, CSITEPLAN_DATE, CSITEPLAN_PARENT, '+ 'CSITEPLAN_LEVEL, CSITEPLAN_TYPE, CSITEPLAN_NODEID) VALUES '; while not DM1.CSITESYNCQUERY.Eof do begin docfilename := StringReplace(DM1.esc(DM1.CSITESYNCQUERY.FieldbyName('CSITEPLAN_PLAN').AsString), '\','/', [rfReplaceAll, rfIgnoreCase]); docfilename := StringReplace(docfilename, '//192.168.100.5/csitestore/plans/', '', [rfReplaceAll, rfIgnoreCase]); sqlstring := sqlstring + '(''' + DM1.CSITESYNCQUERY.FieldbyName('CSITEPLAN_CSITEID').AsString + ''', ''' + docfilename + ''', ''' + DM1.esc(DM1.CSITESYNCQUERY.FieldbyName('CSITEPLAN_PLAN_ORIGNAME').AsString) + ''','+ '''' + DM1.esc(DM1.CSITESYNCQUERY.FieldbyName('CSITEPLAN_DESCRIPTION').AsString) + ''', ''' + DM1.CSITESYNCQUERY.FieldbyName('CSITEPLAN_DATE').AsString + ''',' + '''' + DM1.CSITESYNCQUERY.FieldbyName('CSITEPLAN_PARENT').AsString + ''', ''' + DM1.CSITESYNCQUERY.FieldbyName('CSITEPLAN_LEVEL').AsString + ''', '+ '''' + DM1.CSITESYNCQUERY.FieldbyName('CSITEPLAN_TYPE').AsString + ''', ''' + DM1.CSITESYNCQUERY.FieldbyName('CSITEPLAN_NODEID').AsString + '''),'; DM1.CSITESYNCQUERY.Next; end; sqlstring := Copy(sqlstring,1,(Length(sqlstring)-1)); //get rid of the last , DM1.SQLITEQUERY.Close; DM1.SQLITEQUERY.SQL.Text := 'DELETE FROM consite_plans WHERE CSITEPLAN_CSITEID = ''' + csitetoload + ''';'; DM1.SQLITEQUERY.Execute; DM1.SQLITEQUERY.Close; DM1.SQLITEQUERY.SQL.Text := sqlstring; DM1.SQLITEQUERY.Execute; DM1.SQLITEQUERY.Close; DM1.SQLITEQUERY.SQL.Text := 'SELECT * FROM consite_plans WHERE CSITEPLAN_CSITEID = ''' + csitetoload + ''' AND CSITEPLAN_TYPE = ''file'';'; DM1.SQLITEQUERY.Execute; if DM1.SQLITEQUERY.RecordCount > 0 then begin ftpdirectory := 'csitestore/plans'; try if not DM1.FTP1.Connected then DM1.FTP1.Connect; try try DM1.FTP1.ChangeDir(ftpdirectory + '/' + csitetoload); TSingleSyncThread.Synchronize(nil, procedure begin if DirectoryExists(TPath.GetTempPath + '/' + csitetoload) then TDirectory.Delete(TPath.GetTempPath + '/' + csitetoload, True); end); DownloadFolder('plans', '/home/' + ftpdirectory + '/' + csitetoload , TPath.GetTempPath + '/' + csitetoload); TSingleSyncThread.Synchronize(nil, procedure begin TDirectory.Copy(TPath.GetTempPath + '/' + csitetoload, csiteplanpath + '/' + csitetoload); end); except On E: Exception do begin TSingleSyncThread.Queue(nil, procedure begin CSITEDETFORM.SYNCLABEL.Text := e.Message; end); end; end; finally DM1.FTP1.Disconnect; filestosync.clear; end; except On E: Exception do begin TSingleSyncThread.Queue(nil, procedure begin CSITEDETFORM.SYNCLABEL.Text := e.Message; end); end; end; end; end else begin //if there is nothing to sync DM1.SQLITEQUERY.Close; DM1.SQLITEQUERY.SQL.Text := 'DELETE FROM consite_plans WHERE CSITEPLAN_CSITEID = ''' + csitetoload + ''';'; DM1.SQLITEQUERY.Execute; end; except On E: Exception do begin TSingleSyncThread.Synchronize(nil, procedure begin CSITEDETFORM.SYNCLABEL.Text := e.Message; end); end; end; finally DM1.UniConnection1.Disconnect; FreeandNil(filestosync); end; Geändert von oakley (29. Sep 2023 um 12:03 Uhr) |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |