Italian StartService multipli

AlpVir

Well-Known Member
Licensed User
Longtime User
Sintetizzando al massimo in una Activity ho :

B4X:
Tot=0
  For N=0 to Tot
  Main.CriterioGlobale = "N=" & cstr(N)
  StartService(GPS_DOPO)
Next

Mentre nel service GPS_DOPO

B4X:
Sub Process_Globals
  DimJobScriviDopo As HttpJob
End Sub
Sub Service_Start (StartingIntent AsIntent)
  JobScriviDopo.Initialize("JobScriviDopo", Me)
  JobScriviDopo.PostString ("Script/Scrivi.asp", Main.Criterioglobale)
End Sub

Il tutto funziona, ma se Tot è diverso da zero (5, 10 o più ossia si richiama più volte velocemente lo StartService) lo script Scrivi.asp (che ha un’istruzione “INSERT INTO … “ relativa ad un database MDB) viene popolato con Tot record tutti eguali e con il campo uguale a Tot.

Anche dai log si capisce che PRIMA viene eseguito Tot volte StartService e POI altrettante volte JobDone; ne consegue che per tutti i record N vale Tot (invece di 0, 1, 2, 3, ecc.)

Neanche l’inseriemento all’interno del ciclo For Next di un test
B4X:
DoWhileMain.OK = True
  DoEvents
Loop

(Ovviamente Main.OK è valorizzato uguale a True solo quando JobDone ha successo).
Neppure inserendo un Wait(5).

Che fare ? Suggerimenti ?
Grazie per l’attenzione.
 

LucaMs

Expert
Licensed User
Longtime User
..."Anche dai log si capisce che PRIMA viene eseguito Tot volte StartService e POI altrettante volte JobDone"...

Mi sembra chiaro che il ciclo su N venga eseguito in pochi centesimi di secondo, mentre un singolo Job impiegherà molto di più, per questo ti accade quanto sopra, no? Dovrai cambiare struttura, a quanto ho capito DEVI attendere che un job sia completato prima di far partire il successivo.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
L'analisi che hai fatto è assolutamente esatta. Avevo creduto di rimediare con il ciclo Do White sopra citato. Invece il test di completamento del Job deve essere fatto con una struttura ESTERNA e non con UNA semplice variabile booleana. Ho utilizzato pertanto una List dichiarandola Globale. Sono pertanto riuscito nel mio intento.
Mi sono ispirato alle indicazioni di Erel che trascrivo qui sotto.
- Create a List with the data you want to sent.
- Send List.Get(0) and remove it from the list.
- In JobDone check whether the size of List is larger than 0.
- If yes then submit the next job (List.Get(0)) and remove if from the list.
Grazie e ciao
 

LucaMs

Expert
Licensed User
Longtime User
L'analisi che hai fatto è assolutamente esatta. Avevo creduto di rimediare con il ciclo Do White sopra citato. Invece il test di completamento del Job deve essere fatto con una struttura ESTERNA e non con UNA semplice variabile booleana. Ho utilizzato pertanto una List dichiarandola Globale. Sono pertanto riuscito nel mio intento.
Mi sono ispirato alle indicazioni di Erel che trascrivo qui sotto.

Grazie e ciao


Ottimo. Di niente, hai fatto tutto tu con l'aiuto di Erel :)
 
Top