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.