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

Delphi Discussion :

Thread Anonymous bloque parfois si l'écran est éteint.


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut Thread Anonymous bloque parfois si l'écran est éteint.
    Bonjour,

    J'ai une application multiplateforme Firemonkey dont j'utilise un THread Anonymous pour capturer environs
    toutes les secondes les données du Sensor.AccelerationX et .Y pour les faire analyser et par après environs
    toutes les minutes je les fais afficher dans un diagramme.

    Si l'écran est éteint, le THread devrait encore capturer les données, malheureusement je constate que le
    Thread bloque et n'enregistre pas toutes les minutes dans DrawMotion.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     iTokenSec : integer;
     
      ...
      TThread.CreateAnonymousThread(procedure ()
      var
          MyStopWatch: TStopwatch;
          M, S, OldM, OldS: Word;
          DtTimer: TDateTime;
           acx, acy: single;
      begin
     
        MyStopWatch := TStopwatch.StartNew;
     
          while True do
          begin
                TThread.Synchronize (TThread.CurrentThread,procedure ()
    			begin
     
                S := Trunc(MyStopWatch.Elapsed.Seconds);
                M := Trunc(MyStopWatch.Elapsed.Minutes);
     
                if S <> OldS then
                begin
                  OldS := S;
                  inc(iTokenSec);
     
                  Label1.Text := 'Watch sec>' + inttostr(S);
     
                    acx := MotionSensor1.Sensor.AccelerationX;
                    acy := MotionSensor1.Sensor.AccelerationY;
     
    		MotionStatusCheck(acx,acy);
     
                    if M <> OldM then
                    begin
                       Label2.Text := 'Watch min>' + inttostr(M);                  
                       OldM := M; 
    		   inc(iDrawPoint);
     
                       arX[iDrawPoint] := acx;
                       arY[iDrawPoint] := acy;
     
                       DrawMotion; // dessin sur PlotGrid1
     
                    end;
     
                end;
     
              end);
            sleep(1); 
          end;
     
      end).Start;

    Que puis-je faire pour être sure que le thread passe au moins toutes les minutes pour faire le dessin.

    Je vous remercie beaucoup pour votre aide.
    Salutation

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ton code est étrange, un timer ferait la même chose

    moi je mettrais la lecture du capteur dans le thread et synchroniserait qu'en cas de mise à jour, ceci dit je ne serais pas surpris que Synchronise ne fonctionne plus quand l'écran est éteint...d'ailleurs l'application est probablement mise en pause par l'OS
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    Merci pour ta réponse,

    Au début j'avais bien un timer, mais quand l'écran est éteint, le timer s'arrête aussi directement,
    c'est pour cela que j'ai essayé avec un thread.

    Donc je pense, si j'ai bien compris et configurer l'application met le Thread et le timer en pause,
    si l'écran est éteint.

    Quelle autre solution puis-je utiliser pour résoudre ce problème,
    merci de me mettre sur la voie.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Ce n'est pas dans ces cas que l'on utilise un service (du moins en ce qui concerne Android) ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    Pouvez-vous me proposer une solution, merci beaucoup !

  6. #6
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Citation Envoyé par Ardely Voir le message
    Merci pour ta réponse,

    Au début j'avais bien un timer, mais quand l'écran est éteint, le timer s'arrête aussi directement,
    c'est pour cela que j'ai essayé avec un thread.

    Donc je pense, si j'ai bien compris et configurer l'application met le Thread et le timer en pause,
    si l'écran est éteint.

    Quelle autre solution puis-je utiliser pour résoudre ce problème,
    merci de me mettre sur la voie.
    C'est sur quel(s) OS que tu veux faire tourner cette application ?
    Sur PC, le timer ne s'arrête pas quand on éteint l'écran. C'est sur ios, ou android que tu as ce phénomène ?

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    Le problème se pose pour le moment sur android.

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ce peut être lié au téléphone lui même
    https://stackoverflow.com/questions/...-is-turned-off
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Sur ce lien, il y a des explication du comportement des applications sous Androïd
    https://developer.android.com/guide/...es-and-threads

    Il y a peut-être une option à mettre dans ton fichier manifest pour préciser que tu veux que ton application continue à fonctionner même quand l'utilisateur a éteint l'écran (ou mis en veille en fait)
    Je vais jeter un coup d’œil à cette doc. également car ton problème m’intéresse. Et je vais tester une de mes applications qui utilise un timer, pour voir le comportement quand l'écran est éteint.

  10. #10
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Bon, sur mon application sous Android, le timer est toujours actif même quand l'écran est éteint.
    Et j'ai programmé de la même façon que sur Windows.
    Tu n'as pas modifié les options du projet ?
    Et si tu fais un tout petit projet avec un timer uniquement pour vérifier sur ta tablette ou portable ?

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    Pour le Thread j'ai mis un log dans un mémo qui capture dans une boucle
    tous les secondes le time avec un chiffre qui incrémente.
    Après 2 à 3 minutes, on voit bien un laps de temps qui manque,
    mais tous les chiffres incrémenter son bien séquentiel présent.

  12. #12
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    Oui j'avais déjà fait un petit projet avec seulement le timer sur le portable
    "en mettant timeToStr(Now)"+"-" + inttostr(icount),
    en le rallument après deux à trois minutes on voie que le timer, l'heure c'est arrêté
    puis change à l'heure actuelle du système.

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    J'ai fait des recherches et des tests tout le weekend et voici ce que je peux confirmer,
    si je laisse l'appareil branché à a un câble USB tout fonctionne correctement.
    Si, par contre, l'appareil est débranché du câble USB et l'écran éteint pendant un certain temps,
    l'appareil entre en mode Doze.

    En mode Doze, le système tente d'économiser la batterie en limitant l'accès à l'application.
    C'est pour cela que la synchronisation ne fonctionne pas correctement.

  14. #14
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    Ce n'est pas dans ces cas que l'on utilise un service (du moins en ce qui concerne Android) ?
    Est-ce que je dois passer par un service ...?, pour moi de laisser l'application ouverte est suffisant.
    C'est-à-dire tant que l'application est ouverte, je capture les données du Sensor ( MotionSensor1.Sensor.AccelerationY ).

    De modifier des options ou dans un fichier manifeste je n'ai pas encore trouvé, merci pour l'aide.

  15. #15
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    De ce que je lis ici :
    https://developer.android.com/traini...-standby?hl=en
    Sur Androïd, il est possible de passer des applications dans la "whitelist". Mais c'est une action manuelle à effectuer par l'utilisateur.


    Mais tu peux envoyer ton utilisateur vers la liste blanche avec une fonction particulière de l'api d'Androïd :
    https://developer.android.com/refere...ATION_SETTINGS

Discussions similaires

  1. [Threading] ca bloque sur un wait
    Par vahid dans le forum Java ME
    Réponses: 3
    Dernier message: 08/08/2007, 12h02
  2. Que faire lorsque la résolution d'écran est mauvaise ?
    Par gifffftane dans le forum Administration système
    Réponses: 2
    Dernier message: 13/06/2007, 22h30
  3. Arreter un thread qui "bloque" sur un socket
    Par J-F dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 12/12/2006, 00h04
  4. Mon écran est tourné à l'orizontal
    Par Lanny dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 05/02/2006, 14h25
  5. Est-il possible de savoir si l'écran est allumé ou éteint ?
    Par jakouz dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 10/08/2005, 12h51

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