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 :

Comment savoir si le PC Windows a redémarré (en C) ?


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut Comment savoir si le PC Windows a redémarré (en C) ?
    Bonjour,

    Dans mon programme C, afin de continuer ou non son traitement, je dois vérifier si le PC a été redémarré. Comment faire ?

    En fait, la 1ère fois que le programme est lancé, il fait un traitement.
    Si le programme est lancé une 2nd fois sans avoir redémarré le PC entre les 2, il doit s'arrêter.
    Si le programme une 2nd fois alors que le PC a redémarré entre les 2, alors il doit continuer son traitement.
    J'avais bien pensé à vérifier une variable d'environnement, mais celle-ci n'est valable que pour le process en court. Ceci ne peut donc pas fonctionner.
    J'avais pensé aussi à vérifier un fichier sur le disque mais ceci ne peut pas fonctionner non plus puisque le fichier existerait toujours au reboot du PC.
    J'avais pensé aussi à vérifier une clé de registre mais j'arrive toujours dans le même cas de figure, ceci ne peut donc toujours pas fonctionner.
    Le seul moyen que j'ai donc trouvé (qui me parait pas trop mal) est d'utiliser la mémoire vive (qui se trouve donc purgée lors du redémarrage du PC) mais je ne sais pas comment faire.

    Merci donc pour votre aide.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par Korben-Dallas Voir le message
    J'avais pensé aussi à vérifier un fichier sur le disque mais ceci ne peut pas fonctionner non plus puisque le fichier existerait toujours au reboot du PC.
    J'avais pensé aussi à vérifier une clé de registre mais j'arrive toujours dans le même cas de figure, ceci ne peut donc toujours pas fonctionner.
    Tu fais un programme qui se lance au démarrage de Windows une seule fois et qui modifie le fichier/l'entrée dans le registre. Une fois exécuté, ce programme s'enlève des programmes à lancer. Ça peut être géré dans un seul exécutable, avec des paramètres passés en ligne de commande. Par contre, je crois que ça nécessite des droits élevés sur Vista/7.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Mon programme est déja exécuté au démarrage du PC, et notre environnement ne permet pas trop de rajouter d'autres programmes.
    Il faut savoir que mon programme devra être exécuté sur environ 60000 postes de travail.
    Il me faut donc faire en sorte que mon programme fasse tout le traitement. Bloquer le traitement si pas eu de reboot du PC et si il y a eu reboot alors continuer le traitement.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    Si tu es sûr de ne travailler que sous Windows, le mieux est un mutex nommé, je pense.

    Sinon, il y a plein de façon différentes de faire de la communication entre processus :

    http://msdn.microsoft.com/en-us/libr...ockets_for_ipc

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    OK alor slà ça dépasse mes compétences
    Autant créer une variable environnement (qui se supprime au reboot) je pensais que ça allait être simple mais alors là interraction entre plusieurs process même si mon programme (et donc process s'arrête) alors là... c'est chaud.
    Pour revenir sur la solution de création d'une variable d'environnement, n'y a-t-il pas moyen d'en créer une qui soit visible tout le tps de la vie de Windows ? et pas seulement le tps de vie du process ? genre variable d'environnement system mais qui soit supprimé au reboot. ou un autre moyen.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    Utiliser ces objets n'est pas beaucoup plus difficile que définir une variable d'environnement… L'idée générale étant que, si tu arrives à communiquer avec un autre processus, c'est que cet autre processus est en vie.

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    OK Je vois ce que tu veux dire mais dans ce cas, ça veut dire que cet autre process doit toujours être exécuté (tant que le pc n'est pas rebooté).
    Ceci n'est donc plus très transparent et sécurisé.
    Admettons que l'utilisateur du PC tue ce process témoin, mon programme ne verra donc plus ce process témoin et donc procèdera à son traitement malgré le fait que le PC n'ait pas été redémarré. Ceci engendrera une instabilité du système. D'où le pourquoi du comment qu'il faille redémarrer le PC.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Par défaut
    Bonjour,

    Je te propose d'avoir un fichier où tu stockes la date du dernier redémarrage.

    ton programme pourra par exemple fonctionner sur la base de l'algo suivant :

    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
     
     
    - Récupérer date du dernier redémarrage (appellons la "dateD") via une commande dos 
    - Essai douverture du fichier "date_dernier_reboot.txt"
    - Si echec douverture (parce que fichier nexiste pas)
       - Creer "date_dernier_reboot.txt". 
       - enregistrer "dateD" dans le fichier "date_dernier_reboot.txt"
       - traitement ...
    - Sinon (càd fichier existant et ouvert)
       - comparer la "dateD" au contenu du fichier 
       - si égaux
          - fermer le programme (on a pas redémarré depuis)
       - Sinon
          - traitement ...
          - enregistrer "dateD" dans le fichier "date_dernier_reboot.txt"
       - FinSi
    -FinSi
    On peut récupérer la date de dernier redémarrage grâce à la commande dos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    net statistics workstation
    cette commande renvoie beaucoup de lignes. Mais la date de dernier redémarrage est toujours au même endroit.

    Tu peux donc la récupérer en faisant à peu près ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    system("net statistics workstation > temp.txt"); // Exécution de la commande et redirection de son résultat dans un fichier temp.txt
    ...
    // Parcous du fichier temp.txt et récupération de la date.

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Bonjour,

    Merci pour ces infos. Ne devrait-on pas indiquer ceci ?

    ...
    ...
    Sinon (càd fichier existant et ouvert)
    - comparer la "dateD" au contenu du fichier
    - si inférieur ou égal
    - fermer le programme (on a pas redémarré depuis)
    - Sinon
    ...
    ...
    Je dois dire que je m'y perds un peu

    Mais n'y-a-t-il aucun TAG qq part dans Windows qui indique que le PC a redémarré ?
    Comment font les programmes d'installation qui refusent de s'installer car ils ont découvert que le PC n'a pas redémarré depuis la dernière installation d'une partie de programme (genre les dépendances ou autres) ?

    Sinon ta solution est une piste intéressante je dois dire. Merci

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Mais n'y-a-t-il aucun TAG qq part dans Windows qui indique que le PC a redémarré ?
    Il y en a peut-être mais ça me semble peu probable, parce que trop confus : Supposons qu'un tel tag existe ! Si Windows est en train de tourner sur un PC, c'est que celui-ci a forcément (re-)démarré à un moment donné : donc le TAG sera toujours actif, ce qui ne te sera pas fort utile.
    Ce dont tu as besoin c'est de savoir si le PC a redémarré DEPUIS LA DERNIÈRE EXÉCUTION DE TON PROGRAMME. Çà, je doute que Windows te fournisse une telle information. Mais tu peux te débrouiller pour l'obtenir. Soit en créant un autre processus au démarrage avec qui communiquer (comme les autres te l'ont proposé), soit en utilisant la date de dernier démarrage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sinon (càd fichier existant et ouvert)
    - comparer la "dateD" au contenu du fichier 
    - si inférieur ou égal
    - fermer le programme (on a pas redémarré depuis)
    - Sinon
     
    Je dois dire que je m'y perds un peu
    Bon !
    En gros "dateD" est la date de dernier redémarrage de ton PC. et "dateFichier" est la date du dernier démarrage avant la dernière exécution de ton programme(elle est contenue dans le fichier).


    L'algo que je te propose permet de créer le fichier s'il n'existe pas (à la première exécution de ton programme par exemple) et d'y inscrire la date de dernier démarrage.
    Si le fichier existe déjà (on est donc pas à la première exécution), alors ton programme effectuera son traitement si et seulement si la dateD est différente (et donc supérieure) à la dateF.

    Ce n'est pas la peine de vérifier si la dateD est inférieure à dateFichier. Vu que si l'ordi n'a pas redémarré depuis la dernière exécution de ton programme, alors les deux dates seront strictement égales.
    Si l'ordi a redémarré, les deux dates seront différentes (et dateD sera supérieure à dateFichier, à moins que ton PC ne remonte le temps... ).

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    OK Je comprends un peu mieux.
    Il a fallut que je me fasse un exemple pour mieux comprendre.
    En gros :
    - DateD est le fichier dans lequel la date du dernier démarrage aurait été indiquée ("net statistics workstation > c:\DateD.txt")
    - DateF est le fichier "témoin" qui est une copie du fichier DateD.txt qui indique donc la date de l'avant dernier et aussi le dernier démarrage (si c'est la 1ère exécution du programme)

    C'est bien ça ?
    C'est assez tordu mais fallait le trouver, merci.
    En tout cas, ça aide bien.
    Bon maintenant il va donc falloir que je trouve comment coder tout ça.

Discussions similaires

  1. comment savoir si mon Windows XP est authentique
    Par salimtrois dans le forum Windows
    Réponses: 2
    Dernier message: 11/09/2012, 10h28
  2. Réponses: 2
    Dernier message: 06/08/2012, 14h43
  3. Réponses: 2
    Dernier message: 27/09/2011, 13h30
  4. Comment savoir quand une base a été redémarrée?
    Par farenheiit dans le forum Administration
    Réponses: 2
    Dernier message: 17/12/2007, 11h42
  5. Réponses: 4
    Dernier message: 10/09/2002, 17h09

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