German Wait Sleep oder Delay

joergb

Member
Licensed User
Longtime User
Hallo zusammen

ich bin recht neu bei B4A und auch bei der Android-Programmierung allgemein.
Bisher konnte ich mir mit der Doku und mit den vielen Tipps und Beispielen recht gut helfen, aber nun hänge ich seit Stunden an einem Problem und weiss nicht weiter.

In meinem Programm muss ich mehrere Datei per SMB_Download empfangen, lese diese dann mit File.ReadMap ein , danach erfolgt die weitere Verarbeitung. Sollte es zu einem Fehler beim SMB_Download kommen, wird eine ältere, früher geladene Version verwendet.

zB wird bei Programmstart ein Auszug aus dem Personalstamm als MAP Datei per SMB geladen, dann wird diese Datei eingelesen.
Im Dialog muss der Bediener seine Personal-Nr eingeben und diese wird dann gegen die MAP geprüft. Logischerweise sollte der Download der aktuellen Personaldatei vorher abgeschlossen sein.


Der SMB_Download klappt auch.
Das Problem ist, das ich bisher keine sinnvolle Möglichkeit gefunden habe, mit dem Einlesen in die Map's zu warten, bis der SMB_Download fertig ist.

Die Sleep Funktion ,die hier im Forum zu finden ist, wartet ganz brav, aber die SMB_Events werden nicht abgefeuert
Mit einem Timer an sich geht es gar nicht, er wartet ja nicht, und in einer Schleife auf den Timer-Event zu warten funktioniert ebenfalls nicht, obwohl doEvents aufgerufen wird, und dies laut Doku den Timer nicht lahmlegen sollte

Eine MessageBox aufzurufen geht ebenfalls nicht, weil ich keine Möglichkeit gefunden habe, diese MessageBox programmseitig wieder zu schliessen, wenn der Donwload durchgeführt wurde.
Eine ProgressDialogBox wiederum wartet nicht ...

Gibt es da irgend einen Tipp oder eine Lib o.ä ?
 

Kiffi

Well-Known Member
Licensed User
Longtime User
wenn ich das richtig sehe, dann gibts ein DownloadCompleted() - Event,
wenn der Download abgeschlossen ist:

B4X:
Sub DeinSMB_DownloadCompleted (Url As String, RemoteFile As String, Success As Boolean)
[...]

In diesem Fall musst Du also nicht aktiv auf Abschluss des Downloads mittels
Sleep oder Delay warten.

Grüße ... Kiffi
 

joergb

Member
Licensed User
Longtime User
Yepp, den nutze ich ja auch

Aber der Event kommt irgendwann, und erst dann darf mein Programm weiterlaufen
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Aber der Event kommt irgendwann, und erst dann darf mein Programm weiterlaufen
dann blende solange eine entsprechende Nachricht mittels ProgressDialogShow()
bzw. ProgressDialogShow2() ein. Nach erfolgtem Download blendest Du sie mit
ProgressDialogHide wieder aus.

Deinen Code mittels Sleep oder Delay zu blocken ist zumindest nicht der
empfohlene Weg.

Grüße ... Kiffi
 

joergb

Member
Licensed User
Longtime User
@Kiffi
zuerst mal danke für deine Hilfe


ich versuch mal mein Problem schematisch zu schildern, den Quellcode hier rein zu packen wäre zu unübersichtlich

B4X:
Activite_Create 

Dim SMB_PRM As SMB_PRM_T
SMB_PRM.Server = Kennsatz.GetDefault("SMB_SERVER", "")   
SMB_PRM.User   = Kennsatz.GetDefault("SMB_USER", "")   
SMB_PRM.Passw  = Kennsatz.GetDefault("SMB_PASSW", "")   
SMB_PRM.Domain = Kennsatz.GetDefault("SMB_DOMAIN", "")   
SMB_PRM.Dir    = Kennsatz.GetDefault("SMB_DIR", "")   
       CommSMB.Initialize(SMB_PRM.SERVER,SMB_PRM.User,SMB_PRM.Passw,SMB_PRM.Domain,SMB_PRM.Dir)


LadeStammdaten 'vom smb laden diese Sub startet den Download

'!!!!!!!! Hier muss ich warten bis SMB_Download fertig ist !!!!!!!
'sonst wird im folgenden Quatch eingelesen 

'Einlesen der empfangenen Dateien in Maps
Try
  PersMap = File.ReadMap(File.DirDefaultExternal, "FPA_PERS.MAP")
Catch
  Msgbox("Personal kann nicht gelesen werden", "Fehler") 
End Try
   
Try
    ArtiMap = File.ReadMap(File.DirDefaultExternal, "FPA_ARTI.MAP")
Catch
  Msgbox("Artikel können nicht gelesen werden", "Fehler") 
End Try
    
Try
    ArtGrpMap = File.ReadMap(File.DirDefaultExternal, "FPA_ARTGRP.MAP")
Catch
  Msgbox("Artikelgruppen können nicht gelesen werden", "Fehler") 
End Try
   
Try
    FavMap = File.ReadMap(File.DirDefaultExternal, "FPA_FAV.MAP")
Catch
  Msgbox("Favoriten können nicht gelesen werden", "Fehler") 
End Try


end sub





Sub LadeStammdaten
  ProgressDialogShow("Lade Stammdaten")
  CommSMB.LadeStammdaten 
  ProgressDialogHide
End Sub


Wenn Activity.Create abgearbeitet ist ,soll der Bediener seine Pers-Nr eingeben und dann wird in der soeben geladenen PersMap geprüft, ob diese vorhanden ist und es werden die Berechtigungen eingestellt
Toll wäre es natürlich, wenn die PersMap gefüllt wäre :confused:

Es kann doch nicht sein, das in b4a nicht auf ein Event gewartet werden kann. Das konnte jeder olle PDA mit WinCE vor 5 Jahren schon.

Wie schon eingangs geschrieben, ich bin sowohl Android als auch B4A Neuling Aber wenn ich "Sleep" für Android googel, kennt das zugrunde liegende Java wohl einen Sleep Befehl. Den kann ich wohl nur nicht mal eben einbinden, oder ?
 

Kiffi

Well-Known Member
Licensed User
Longtime User
irgendwie schreiben wir aneinander vorbei :)

B4X:
LadeStammdaten 'vom smb laden diese Sub startet den Download

Sub LadeStammdaten
  ProgressDialogShow("Lade Stammdaten")
  CommSMB.LadeStammdaten 
End Sub

Sub CommSMB_DownloadCompleted(...

  ProgressDialogHide

  If Success ...

    ' Einlesen der empfangenen Dateien in Maps

    Try
      PersMap = File.ReadMap(File.DirDefaultExternal, "FPA_PERS.MAP")
    Catch
      Msgbox("Personal kann nicht gelesen werden", "Fehler") 
    End Try

    ' and so on...

  End If

End Sub

Jetzt klarer?

Grüße ... Kiffi
 

joergb

Member
Licensed User
Longtime User
yepp, so in der Art mach ich es nun

ich disable sämtliche Controls , Button und Views , warte bis der Lesevorgang abgeschlossen ist, um dann alles wieder zu enablen :(
 
Top