Bonjour tout le monde,
Meilleurs voeux pour cette nouvelle année !
Plein de bonnes choses !
Alors je viens vers vous car je constate une chose étrange que je n'arrive pas à expliquer ni à contourner.
J'ai un projet sous Android (version 14 sur un Samsung) avec WM28.
Déjà merci pour ceux qui vont prendre le temps de me lire...
Le rôle de l'application est simple : suivre la position GPS de mon tél.
Celle-ci communique avec mon système de domotique selon l'emplacement du tél.
Il faut bien sûr que la position soit récupérée même quand l'appli est en arrière plan.
Les fonctions GPSSuitxxx() fonctionnent très bien quand l'appli est lancée au 1er plan.
Mais PAS lorsque celle-ci se trouve en arrière plan.
Je n'utilise pas non plus les TacheEnArrierePlanxxx() car le temps minium de répétition de la tâche est de 15 min (trop long dans mon cas)
Il me reste donc les thread.
Notamment avec la fonction ThreadPersistant()
Cela fonctionne plutôt bien.
Sauf que pour faire boucler mon thread, j'utilise la fonction ThreadPause() pour temporiser le thread, et celle-ci semble... perdre la boule !!
Je tente de l'expliquer :
voici le code (simplifié) utilisé pour lancer le thread sur l'évènement "Mise en arrière plan" de la fenêtre principale :
c'est top, le thread se lance, la notif apparait, ça tourne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ThreadExécute("LOOP_MAIN",threadCopieComplèteContexteHFSQL,LOOP_MAIN) //il faut une notifiaction lors de l'utilisation de ThreadPersistant Notif_Thread est une Notification Notif_Thread..Titre = ProjetInfo(piNomProjet) Notif_Thread..Message = "Thread en cours....." ThreadPersistant("LOOP_MAIN",Notif_Thread)
voici le code simplifié du thread : (il doit tourner toute les 30 s)
Et c'est cette boucle de temporisation qui coince, au bout d'un certain temps seulement (aléatoire)...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 PROCÉDURE LOOP_MAIN() TANTQUE PAS ThreadArrêtDemandé() //... ici le process de traitement de la position GPS //boucle de temporisation //je teste toute les 1 seconde pendant 30 s, s'il faut couper le thread ou pas. Cela permet d'éviter d'avoir à attendre 30 s lors de l'arrêt du thread POUR i = 1 À 30 SI ThreadArrêtDemandé() ALORS SORTIR FIN ThreadPause(1 s) FIN FIN
J'ai le moyen de tracer la variable "i" dans un log avec un horodate-heure.
Au début du lancement du thread, il n'y a aucun problème, ça tourne nickel pendant des fois plus d'une heure.
la variable i s'incrémente bien de 1 à 30 chaque seconde.
Et tout à coup, ça déconne, le threadPause() ne prend plus une seconde mais plusieurs... voir plusieurs dizaine de minutes, ça augmente dans le temps.
Je m'en rends compte avec la variable i dans les logs.
J'ai essayé de faire autrement :
- remplacer l'incrémentation de i par le test d'une variable dateheure : même résultat
- remplacer threadPause() par un multitache(-30s) : grosse erreur
(logique...)
- remplacer ThreadArretDemande() par un boolean gérer lors de la demande d'arrêt : même résultat
J'aimerai contourner ThreadPause(), mais comment ?
Là, je sèche, plus d'idées...
C'est bien dommage
Est ce qqun a d'autres propositions / idées / solutions ?
merci d'avance pour votre aide !
Partager