IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windev Mobile Discussion :

Android - bug avec ThreadPause() dans un thread persistant


Sujet :

Windev Mobile

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2010
    Messages
    471
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 471
    Par défaut Android - bug avec ThreadPause() dans un thread persistant
    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 :

    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)
    c'est top, le thread se lance, la notif apparait, ça tourne.

    voici le code simplifié du thread : (il doit tourner toute les 30 s)

    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
    Et c'est cette boucle de temporisation qui coince, au bout d'un certain temps seulement (aléatoire)...

    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 !

  2. #2
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 458
    Billets dans le blog
    1
    Par défaut
    Salut,
    Il y a plusieurs soucis avec ta question
    Tu n'explique pas la raison de tes thread.
    Ensuite sur mobile, il faut éviter tout bloquage de l'application et programmer en asynchrone.
    Et enfin tu n'indique pas ta version d'Android ce qui est important pour l'utilisation du GPS
    Surtout en Android 10 et supérieur.

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2010
    Messages
    471
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 471
    Par défaut
    merci pour ton aide,

    alors la version android et la version 14, je le précisais au début.

    L'utilisation d'un thread s'impose justement car c'est le seul moyen qu'il me reste pour faire tourner la fonction quand l'application est en arrière plan (Thread Persistant)

    Du coup il me semble bien être en asynchrone !?

  4. #4
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 458
    Billets dans le blog
    1
    Par défaut
    Désolé, j'ai dû lire en diagonale ta question.
    (Ce qui est rare chez moi)
    Normalement, le threadpause n'est pas nécessaire si tu utilises ThreadPersistant
    A ce sujet Il existe un exemple "Android Notifications Persistantes"
    Et c'est ce qu'il faut faire avec GPSSuitDéplacement
    Tu peux aussi regarder l'exemple "Android GPS"
    Je n'ai pas ta version de windev mobile pour vérifier si ces exemples ont été modifié avec les nouvelles règles de Google.

  5. #5
    Membre éclairé
    Inscrit en
    Mars 2010
    Messages
    471
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 471
    Par défaut
    mais attention,

    les fonctions GPSSuisxxx() ne fonctionnent qu'avec l'application au premier plan !
    C'est ce que j'expliquais dans le premier post.

    La version de windev est 28.

    Le ThreadPause me permet de temporiser le traitement.
    ThreadPersistant() n'a aucune notion de temporisation.

  6. #6
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 458
    Billets dans le blog
    1
    Par défaut
    Salut
    Tu as du mal comprendre la page d'aide
    https://doc.pcsoft.fr/fr-FR/?gpssuit...ement_fonction
    Lit bien les Spécificité Android 11
    La partie Si l'application nécessite la localisation en arrière-plan
    Ainsi que les Spécificité Android 12

    C'est la procédure appelée par la fonction GPSSuitDéplacement qui doit être dans un thread persistant. Et non pas la fonction GPSSuitDéplacement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Executer une fonction (avec paramètres) dans un thread secondaire
    Par you38 dans le forum Threads & Processus
    Réponses: 21
    Dernier message: 06/08/2010, 08h12
  2. Bugs avec QRadioButton dans des QGroupBox
    Par Deamon dans le forum Qt
    Réponses: 2
    Dernier message: 07/06/2010, 09h26
  3. bug avec Find dans une function
    Par paiva44 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/01/2010, 18h04
  4. [RichFaces] Bug avec SuggestionBox dans dataTable
    Par albaille dans le forum JSF
    Réponses: 31
    Dernier message: 10/12/2007, 08h46
  5. [CCom]Probleme avec SendMessage dans le thread
    Par homeostasie dans le forum Visual C++
    Réponses: 7
    Dernier message: 18/06/2007, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo