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

C# Discussion :

Application en tâche de fond


Sujet :

C#

  1. #1
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut Application en tâche de fond
    Bonjour,

    je souhaite faire tourner une application en tâche de fond sur mon PDA (Pocket PC).

    Pour l'instant j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.Threading.Timer clock = new Timer(new TimerCallback(writePosition), null, 0, 10000);
    System.Threading.Thread.Sleep(Timeout.Infinite);
    Ca remplit bien son job, seulement j'ai un petit inconvénient, quand je lance l'application, j'ai le curseur du PDA qu'est en mode "Sablier" (une roue qui tourne) mais dès que je change de dossier, ce dernier disparaît.

    Y a t-il un moyen d'optimiser la mise en tâche de fond afin que je n'ai plus ce souci de tablier?

    Attention, j'utilise le Compact Framework

    Merci à toute personne pouvant me venir en aide.

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Je me demande ce que ça fait ce code ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(!FinDeLapplication)
    {
      Application.DoEvents();
      Thread.Sleep(10);
    }
    à la place de ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Thread.Sleep(Timeout.Infinite);
    ...

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    ça donne que je suis en application Console et donc "Application" n'est pas disponible...



    Tiens, par ailleurs, comment la quitter proprement cette application?

    Pour l'instant, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.CurrentThread.Abort();
    à défaut de mieux vu que Environment.Exit() n'est pas dispo, Application.Exit() non plus



  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Rah t'es embêtant avec ton Compact Framework

    Mais je continue sur ma lancée pour vérifier (vu que j'ai pas de Pocket PC). Donc si on code soit même la fonction DoEvents sur Windows normalement ça doit être ça :
    Code c# : 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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    [StructLayout(LayoutKind.Sequential)]
            struct MSG
            {
                public IntPtr hwnd;
                public UInt32 message;
                public IntPtr wParam;
                public IntPtr lParam;
                public UInt32 time;
                public POINT pt;
            }
     
            [StructLayout(LayoutKind.Sequential)]
            struct POINT
            {
                public int X;
                public int Y;
     
                public POINT(int x, int y)
                {
                    this.X = x;
                    this.Y = y;
                }
     
                public static implicit operator System.Drawing.Point(POINT p)
                {
                    return new System.Drawing.Point(p.X, p.Y);
                }
     
                public static implicit operator POINT(System.Drawing.Point p)
                {
                    return new POINT(p.X, p.Y);
                }
            }
     
            [DllImport("user32.dll")]
            static extern bool TranslateMessage([In] ref MSG lpMsg);
     
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin,
               uint wMsgFilterMax);
     
            [DllImport("user32.dll")]
            static extern IntPtr DispatchMessage([In] ref MSG lpmsg);
     
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool PeekMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin,
               uint wMsgFilterMax, PeekMessageParams wRemoveMsg);
     
            [Flags]
            public enum QueueStatusFlags : uint
            {
                QS_KEY = 0x0001,
                QS_MOUSEMOVE = 0x0002,
                QS_MOUSEBUTTON = 0x0004,
                QS_POSTMESSAGE = 0x0008,
                QS_TIMER = 0x0010,
                QS_PAINT = 0x0020,
                QS_SENDMESSAGE = 0x0040,
                QS_HOTKEY = 0x0080,
                QS_ALLPOSTMESSAGE = 0x0100,
                QS_RAWINPUT = 0x0400,
                QS_MOUSE = QS_MOUSEMOVE | QS_MOUSEBUTTON,
                QS_INPUT = QS_MOUSE | QS_KEY | QS_RAWINPUT,
                QS_ALLEVENTS = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY,
                QS_ALLINPUT = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE
            }
     
            [Flags]
            public enum PeekMessageParams : uint
            {
                PM_NOREMOVE = 0x0000,
                PM_REMOVE = 0x0001,
                PM_NOYIELD = 0x0002,
                PM_QS_INPUT = QueueStatusFlags.QS_INPUT << 16,
                PM_QS_POSTMESSAGE = (QueueStatusFlags.QS_POSTMESSAGE | QueueStatusFlags.QS_HOTKEY | QueueStatusFlags.QS_TIMER) << 16,
                PM_QS_PAINT = QueueStatusFlags.QS_PAINT << 16,
                PM_QS_SENDMESSAGE = QueueStatusFlags.QS_SENDMESSAGE << 16
            }
     
            public virtual void DoEvents()
            {
                MSG pMsg;
     
                while(PeekMessage(out pMsg, IntPtr.Zero, 0, 0, PeekMessageParams.PM_REMOVE))
                {
                        TranslateMessage(ref pMsg);
                        DispatchMessage(ref pMsg);
                }
            }
    Après c'est Windows CE, donc tout les user32.dll des DllImport doivent être remplacés par coredll.dll.

    Dit moi si ça marche ...

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Hum, dis, tu me tape si je te dis que :

    n'est pas dans le CF?

    Tu peux, mais pas trop fort...

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Si il y es forcément, c'est toi qui n'as pas rajouté une référence vers System.Drawing.dll.

    Ceci dit ce n'est pas important, tu peux virer
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     public static implicit operator System.Drawing.Point(POINT p)
                {
                    return new System.Drawing.Point(p.X, p.Y);
                }
     
                public static implicit operator POINT(System.Drawing.Point p)
                {
                    return new POINT(p.X, p.Y);
                }

  7. #7
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    C'était bien ça, me manquait la référence vers la DLL.

    Merci, mais ça n'est pas tout à fait résolu...

    En effet, vu que je suis dans un programme où tout est static (le Main tout ça...), je ne peux pas appeler le DoEvent... à moins que je m'y prennne mal?


    pour ta patience

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par Arnaud F. Voir le message
    En effet, vu que je suis dans un programme où tout est static
    ouuuuuuuh, que c'est vilain
    Question conception je trouve beaucoup plus élégant de créer une classe destinée à contenir la logique du programme et tout et tout que j'instancie dans le Main ... mais je le dit pas trop fort parce que sur mes petits utilitaires je le fait à cause de cette éternelle flemme

    Mais ce n'est pas un problème, tu modifies
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public virtual void DoEvents()
    En
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void DoEvents()

  9. #9
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    C'était bien ça, en fait j'avais laissé le virtual avec le static

    Par contre, je me pose une question, à quoi sert le DoEvent, rendre la main au système?

    D'ailleurs, j'avais édité mon post mais tu n'a pas du le voir :

    Citation Envoyé par Arnaud F. Voir le message
    Tiens, par ailleurs, comment la quitter proprement cette application?

    Pour l'instant, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.CurrentThread.Abort();
    à défaut de mieux vu que Environment.Exit() n'est pas dispo, Application.Exit() non plus
    Y a plus propre?


    Tournée de champomy quand cette histoire sera résolue

  10. #10
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par Arnaud F. Voir le message
    Par contre, je me pose une question, à quoi sert le DoEvent, rendre la main au système?
    Normalement Windows envoi des messages au processus une fois qu'il est lancé et DoEvents permet de les traiter et de ne pas laisser Windows sur sa faim. Normalement ça ne sert que quand on a une fenêtre pour permettre de traiter le message WM_PAINT (qui permet de dessiner la fenêtre) mais je pense que ça pourrait peut être résoudre ton problème de sablier. Peut être même qu'une boucle à la place de ton gros Sleep fonctionnerait je ne sais pas, vu que là tu suspend carrément le Thread principal pour une durée indéterminée ce qui est assez violent.

    L'avantage avec une boucle d'attente pour ton programme c'est que tu peux indiquer dans une variable globale s'il faut la continuer ou si le programme doit s'arrêter (cf. mon while(!FinDuMachin)).

  11. #11
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Sidéré

    Citation Envoyé par smyley Voir le message
    L'avantage avec une boucle d'attente pour ton programme c'est que tu peux indiquer dans une variable globale s'il faut la continuer ou si le programme doit s'arrêter (cf. mon while(!FinDuMachin)).
    Vu que je veux un démon, je veux qu'il tourne continuellement en tâche de fond. Mais il est vrai que ça peut être une bonne idée vu que je vais implémenter un arrêt du démon si le niveau de la batterie est trop faible

    Bref, merci beaucoup pour la patience, les explications, tout quoi


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

Discussions similaires

  1. [WD15] Application en tâche de fond
    Par Trusty823 dans le forum WinDev
    Réponses: 0
    Dernier message: 27/07/2013, 12h56
  2. [WD17] Piloter une application en tâche de fond
    Par PaulNero dans le forum WinDev
    Réponses: 14
    Dernier message: 30/07/2012, 08h47
  3. application en tâche de fond
    Par Metrica dans le forum C++Builder
    Réponses: 6
    Dernier message: 16/03/2011, 22h28
  4. application en tâche de fond
    Par lolodev dans le forum Java ME
    Réponses: 3
    Dernier message: 14/08/2007, 03h34
  5. executable en "tâche de fond"
    Par jaquet_vincent dans le forum Windows
    Réponses: 5
    Dernier message: 22/10/2004, 14h49

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