SpiderBasic Timer

Vous voulez partagez vos créations en SpiderBasic ?
BarJo
Messages : 6
Inscription : jeu. 08/juil./2021 18:08

SpiderBasic Timer

Message par BarJo »

Bonjour a tous,

Je viens de tester SpiderBasic (pour l'instant en version gratuite). Je le trouve vraiment bien pour développer des applis mobiles.
Cependant, lors de mes tests, je me suis retrouvé confronté à un problème sur lequel je n'ai pas trouvé de la solution.

Dans mon test, j'ai fait une appli qui récupère les coordonnés GPS et les transmet vers un site web.
Pour cela, j'ai mis en place un timer pour pouvoir avoir une récurrence des données GPS.

Mon problème reside dans le fait que le timer ne fonctionne pas lorsque l'appli n'est pas en premier plan.

Ma question, est-il possible de faire fonctionner un timer en background?
Y a t-il une solution de contournement ?

Merci pour votre aide.

Voici un exemple raccourci mais fonctionnel de mon programme :

Code : Tout sélectionner

Procedure Events()
  Debug "GeolocationLatitude  : " + GeolocationLatitude()
  Debug "GeolocationLongitude : " + GeolocationLongitude()
EndProcedure

StartGeolocation(200,#False)

If OpenWindow(0, 0, 0, 300, 200, "Timer", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  AddWindowTimer(0, 0, 1000)
  BindEvent(#PB_Event_Timer, @Events())
EndIf
Joyeux Noël a tous.
Dernière modification par BarJo le mar. 16/janv./2024 12:57, modifié 1 fois.
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: SpiderBasic Timer

Message par case »

je connais pas spider basic mais a mon avis dans les autorisations de l'appli sur le tel il doit y avoir fonctionnement en arriere plan autorise quelque part ou dans la gestion de l'energie je dirais
ImageImage
BarJo
Messages : 6
Inscription : jeu. 08/juil./2021 18:08

Re: SpiderBasic Timer

Message par BarJo »

Oui, j'y a pensé, mais cela n'agit pas sur l'appli.
Sur mon xiaomi, j'ai mis "pas de restriction" pour l'économiseur de batterie pour cette appli.


Cependant, dans mes recherches, j'ai trouvé deux méthodes ou évènements (onPause() et onResume()) qui semble impacté les applis.

Si quelqu'un en sait plus au sujet de ces méthodes/évènements, je suis preneur.

Mais, sont-elles accessibles a javascript ?

Merci Case d'avoir pris le temps de me répondre.

Joyeux Noël à tous ! 🎄
BarJo
Messages : 6
Inscription : jeu. 08/juil./2021 18:08

Re: SpiderBasic Timer

Message par BarJo »

Salut à tous et Bonne Année 2024,

J'ai un peu bossé sur mon problème, j'ai un peu avancé mais ce n'est pas encore suffisant.
Je pense que je ne pourrais pas faire mon test completement avec SpiderBasic, les API Android ne semble pas accessible une fois mis en arrière-plan.
En effet, dans mon test je veux récupérer la géolocalisation en arrière-plan, cela fonctionne les premieres secondes ensuite plus rien.
Je n'ai pas la maitrise du monde Android, mais peut être manque t'il une permission pour que cela puisse fonctionner

J'ai fait 2 fonctions qui ne me servent pas, mais qui pourront peut-être vous servir.
Il est possible qu'elles ne soient pas parfaites, vous jugerez.

la premiere: AddWorker:
Peu remplacer AddTimer sans etre lié à une fenetre.

Code : Tout sélectionner

; Variable pour le test
Global count = 0

; fonction Addlistener
; permet l'execution d'une procedure sans fenetre et fonctionne en arriere plan
; limite:
; ne permet pas l'usage de la geolocalisation en arriere plan par exemple
Procedure AddListener(Timeout.i, *function, argument.s = "")
  Debug "AddListener"
  Define str.s = Str(*function)
  Define func.s, arg.s
  
  !const regex = /^function\s{0,}([f][_][a-z0-9]{1,})\s{0,}\(([a-zA-Z0-9_,\s]{0,})\)/gm;
  !let m;
  !while ((m = regex.exec(v_str)) !== null) {
  !  if (m.index === regex.lastIndex) {
  !    regex.lastIndex++;
  !  }
  !  v_func = m[1];
  !  v_arg = m[2];
  !}
  
  Debug "Timeout: " + Timeout
  Debug "function: " + func.s
  Debug "argument: " + argument + " " + arg.s
  
  ;https://briangrinstead.com/blog/load-web-workers-without-a-javascript-file/
  !// makeWorker is a little wrapper for generating web workers from strings
  !function makeWorker(script) {
  !    var URL = window.URL || window.webkitURL;
  !    var Blob = window.Blob;
  !    var Worker = window.Worker;
  !
  !    if (!URL || !Blob || !Worker || !script) {
  !        return null;
  !    }
  !
  !    var blob = new Blob([script]);
  !    var worker = new Worker(URL.createObjectURL(blob));
  !    return worker;
  !}
  !
  !    self.addEventListener('message', function(e) {
  !        postMessage(e.data / 2);
  !    },false);
  !
  !var inlineWorkerText =
  ; Fonction wait
  !"function wait(ms){ var start = new Date().getTime(); var end = start; while(end < start + ms) { end = new Date().getTime(); }};" 
  !+
  ; listener
  !"self.addEventListener('message', function(e) {while (true) { postMessage('loop') ; wait(Number(e.data)); }; } ,false);";
  !var inlineWorker = makeWorker(inlineWorkerText);
  !inlineWorker.onmessage = function(e) { window[v_func](e.data) };
  !
  !inlineWorker.postMessage(v_timeout);
EndProcedure
  
; fonction de test
Procedure Events()
  Debug count 
  count = count +1
EndProcedure

;ajout du listener
AddListener(5000, @Events())

La deuxième AddWorker:
Permet exécuter une fonction façon thread

Code : Tout sélectionner

;fonction AddWorker
; name = nom du worker
; function qui sera executé par le worker (les fonctions SpiderBasic ne sont pas utilisable!)
; retourne l'instance du worker
Procedure.i AddWorker(name.s, *function)
  Define worker
  func.s = Str(*function)
  Debug func
  !//As a worker normally take another JavaScript file To execute we convert the function in an URL: http://stackoverflow.com/a/16799132/2576706
;  !function getScriptPath(foo){ return window.URL.createObjectURL(new Blob([foo.toString().match(/^\s*function\s*\(\s*\)\s*\{(([\s\S](?!\}$))*[\s\S])/)[1]],{type:'text/javascript'})); }
  !v_func = window.URL.createObjectURL(new Blob([v_func.toString().match(/^\s*function\s*[a-z_]*\(\s*\)\s*\{(([\s\S](?!\}$))*[\s\S])return\s*[0-9]/)[1]],{type:'text/javascript'}));
  !
  !/*
  ! *	Here are the workers
  ! */
  !//Worker
;  !var worker = new Worker(getScriptPath(v_func));
  !var v_worker = new Worker(v_func);
  !//We add a listener To the worker To get the response And show it in the page
  !v_worker.addEventListener('message', function(e) {
  !    console.log(e.data);
  !}, false);
  ;!console.log(worker)
;  !worker.postMessage(''); 
  ProcedureReturn worker
EndProcedure

;function StartWorker
; worker = intance du worker
; argument = parametres pour le worker
Procedure StartWorker(worker,argument = '')
  !console.log(v_worker)
  !v_worker.postMessage(v_argument); 
EndProcedure

;function TestWorker
; uniquement en javascript, les fonctions SpiderBasic ne peuvent pas etre utilisés
Procedure TestWorker()
  !self.postMessage('le test: TestWorker');
EndProcedure

;creation de l'instance
test = AddWorker("test", @TestWorker())
;demarrage de l'instance
StartWorker(test)
Si vous avez des idées/solution pour utiliser la géolocalisation par exemple, je suis preneur.
Mais je pense que cela ne pourra être fonctionnel que si SpiderBasic le permet.
BarJo
Messages : 6
Inscription : jeu. 08/juil./2021 18:08

Re: SpiderBasic Timer

Message par BarJo »

Tony28 a écrit : jeu. 18/janv./2024 14:12 Bonjour,

Il est important de noter que la capacité d'exécution de code en arrière-plan sur un appareil dépend de la politique de l'OS (système d'exploitation) de l'appareil en question. Dans la plupart des systèmes d'exploitation mobiles, tels qu'Android et iOS, les applications ont des restrictions concernant l'exécution de code en arrière-plan pour des raisons de sécurité et d'économie d'énergie. Cela signifie que les timers ou les tâches en arrière-plan peuvent être limités ou désactivés lorsque l'application n'est pas en premier plan.

Dans le code que vous avez fourni, le timer est lié à la fenêtre de l'application, ce qui signifie qu'il est probablement désactivé lorsque l'application passe en arrière-plan. Il n'y a généralement pas de solution de contournement directe pour faire fonctionner un timer en arrière-plan sur la plupart des plateformes mobiles en raison de ces restrictions.

Cependant, il existe des fonctionnalités spécifiques à chaque plateforme qui peuvent vous permettre d'obtenir des mises à jour de géolocalisation en arrière-plan, comme les services de localisation en arrière-plan sur iOS ou les services de localisation en arrière-plan sur Android. Cependant, l'accès à ces fonctionnalités dépendra de la plateforme que vous ciblez, et il peut être nécessaire d'ajuster votre code en conséquence.

Il est important de noter que l'utilisation de fonctionnalités de localisation en arrière-plan peut avoir un impact sur la durée de vie de la batterie de l'appareil, et il est donc important de les utiliser avec parcimonie et de manière responsable.
Bonjour Tony28,

Oui, je suis au courant des problématique de batterie et autres permissions.
Dans un premier temps, ce n'est pas mon sujet.
Ensuite oui, j'ai vu que le timer était mis en pause après 5 secondes de mise en arrière-plan.

Pour cela, j'ai cherché des solutions de contournement du dit timer.
En passant par un listener, ma fonction est bien exécutée en arrière-plan comme je le souhaitais, mais les API ne retourne aucune valeur.
Mon problème, n'est pas la géolocalisation en soit, mais plus généralement les API system (dans mon cas Android)
En conclusion, je pense que je ne pourrais effectivement pas faire ce soft, sauf avec une evolution de SpiderBasic dans le sens ajout des accès aux permissions.

Cependant, pour t'as réponse ne me fait pas avancer mais me confirme que dans état, je n'ai pas besoin acquérir une license de SpiderBasic.
En effet, mon code était un test de faisabilité, apparemment, ce ne le fait pas.
Cela n'empêche pas que je trouve SpiderBasic excellent comme outils.
Dommage que les accès system ne sont pas pris en charge comme je le souhaitais. Peut-être sur une version future !

Encore merci,
BarJo.
Répondre