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 :

Ajouter 24h a un SystemTime


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 54
    Par défaut Ajouter 24h a un SystemTime
    Bonjour,

    Je travail sous Windows CE 5.0 et j'utilise la fonction CeRunAppAtTime pour lancer une application a heure fixe. Lors du lancement de cette application je reinitialise le lancement comme suit :

    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
    	int iNanoToSeconds = 10000000;
     
    	SYSTEMTIME stfin;
     
    	SYSTEMTIME st;
     
    	__int64 ft1;
    	GetSystemTime(&st);
    	SystemTimeToFileTime(&st, (FILETIME*)&ft1);//retourne le nombre de 100 nano secondes depuis l'an 1601
     
    	ft1 += 60*60*24*1*iNanoToSeconds; //ajout d'une journée
    	FileTimeToSystemTime((FILETIME*)&ft1, &stfin);//retrouver le SystemTime
    	unsigned short heure= 22;
    	unsigned short minute= 15;
     
            stfin.wHour=heure;
    	stfin.wMinute=minute;
    	stfin.wSecond=0;
    	stfin.wMilliseconds=0;
    	return CeRunAppAtTime(L"\\Program Files\\Pickup Services\\GIPDV\\reveil.exe",&stfin);
    Seulement voila, cela ne rajoute pas 24h mais quelques minutes seulement. Je ne comprends pas d'ou cela vient et comme j ene peut pas utiliser Ctime j'aimerais savoir comment ajouter 24h a mon systemTime.

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Franchement, pour les ajouts de temps, je pense que tu devrais plutôt utiliser un FILETIME, quitte à le convertir par la suite.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 54
    Par défaut
    Merci de ta réponse.

    J'ai essayé en passant par un FILETIME mais j'ai un souci de precision je fiat la manip suivante :

    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
    __int64 iNanoToSeconds = 10000000;
     
    SYSTEMTIME stfin;
     
    SYSTEMTIME st;
     
    __int64 ft1;
     
    GetSystemTime(&st);
     
    SystemTimeToFileTime(&st, (FILETIME*)&ft1);
     
    ft1 += 60*60*24*1*iNanoToSeconds; //add a day
     
    FileTimeToSystemTime((FILETIME*)&ft1, &stfin);
     
    unsigned short heure= 22;
     
    unsigned short minute= 15;
     
    stfin.wHour=heure;
     
    stfin.wMinute=minute;
     
    stfin.wSecond=0;
     
    stfin.wMilliseconds=0;
     
    return CeRunAppAtTime(L"\\Program Files\\Pickup Services\\GIPDV\\reveil.exe",&stfin);
    J'ai trouvé sur le net qu'il etait deconseiller de faire ce genre de manip mais je n'ai pas trouvé d'exemple indiquant comment faire.

    Une solution peut etre?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh... Je ne vois pas trop à quoi te sert de réinitialiser plein de champs (d'où grosse perte de précision) APRÈS le calcul.

    Mon conseil, c'est plutôt:
    • Tu prends la date courante
    • Tu la règles à 22h15 précises comme tu le voulais
    • Tu convertis en FILETIME / ULARGE_INTEGER / Int64
    • Tu Ajoutes
    • Tu convertis en SYSTEMTIME


    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
    const unsigned __int64 i100NanoToSeconds; = 10000000; // 10 millions
    const unsigned __int64 jour = iNanoToSeconds * 60*60*24*1:
     
    SYSTEMTIME st;
    SYSTEMTIME stfin;
     
    GetSystemTime(&st);
    unsigned short heure= 22;
    unsigned short minute= 15;
     
    st.wHour=heure;
    st.wMinute=minute;
    st.wSecond=0;
    st.wMilliseconds=0;
     
    {
        ULARGE_INTEGER ul;
        SystemTimeToFileTime(&st, (FILETIME*)&ul);
        ul.QuadPart += jour; //add a day
        FileTimeToSystemTime((FILETIME*)&ul, &stfin);
    }
     
    return CeRunAppAtTime(L"\\Program Files\\Pickup Services\\GIPDV\\reveil.exe",&stfin);
    Encore que, en théorie, ça ne devrait pas *vraiment* causer de problème.

    Quel est le "souci de précision" qui te tracasse ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 54
    Par défaut
    MErci pour ta réponse je test dés que possible.

    Pour mon problème de precision, avec le bout de code que j'ai mis, je n'ajoutais non pas 1 jour mais 2 malheureuse minutes, enfin a peut pres parce que ce n'etait pas exactement 2 minutes c'etait assez variable.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sans doute était-ce dû à un dépassement de capacité dans le calcul de 60*60*24*1*iNanoToSeconds : Aucun des types nombres n'était déclaré en tant qu'int64, donc si le calcul s'effectuait sur 32 bits, tu avais un bel overflow...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  3. [VB6] [ADO] Pb ajout enregistrement table liée
    Par fikou dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 01/10/2002, 11h49
  4. Connaitre l'unitée à ajouter dans USES
    Par DelphiCool dans le forum Langage
    Réponses: 7
    Dernier message: 01/08/2002, 13h48
  5. Ajouter une aide
    Par Mailgifson dans le forum C++Builder
    Réponses: 5
    Dernier message: 12/06/2002, 13h32

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