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

Web & réseau Delphi Discussion :

[Delphi 6] Comment détecter si un poste est connecté ?


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    peut être une autre approche, proposé par Aurélien modérateur du forum Développement Windows , pour un problème semblant identique :
    Tu peux utiliser IsNetworkAlive:
    http://msdn.microsoft.com/library/en-us/syncmgr/syncmgr/isnetworkalive.asp
    A vérifier.

  2. #2
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    A première vue, cette solution semble fonctionner : http://www.developpez.net/forums/vie...782153#1782153

    Elle donne la bonne réponse quand le cable réseau est débranché, et réponse quasi-instantannément.

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  3. #3
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Et bien non : encore un problème. si, si ...

    Sous NT, le ping mets 37 secondes environ pour échouer, quand le cable réseau est débranché.
    Pourtant, dans le dernier paramètre de la fonction IcmpSendEcho, j'ai mis 1000 pour un TimeOut d'une seconde.

    Citation Envoyé par MSDN
    Timeout
    [in] Time to wait for replies, in milliseconds.
    Où est l'erreur ?

    : :
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  4. #4
    Membre expérimenté
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Par défaut
    C'est fait par Microsoft
    En fait je vois pas là... essay de mettre 1... ou alors, utilise une fonction callback (si y'a un moyen )

  5. #5
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par /dev/null
    utilise une fonction callback (si y'a un moyen )
    C'est-à-dire ?

    :
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  6. #6
    Membre expérimenté
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Par défaut
    Je ne sais pas si les fonction que tu emplois peuvent integrer le principe de callback... en gros une fonction apeller en evenement...
    Si oui, dans ce cas tu fait
    1. Ping Threader
    2. Si TimeOut Ecouler (grace a un timer) continuer sans tenir compte du Thread
    3. Si TimeOut pas Ecouler est connecter...

    Je t'avoirais que j'ai peur de dire une bêtise

  7. #7
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Le coup du Timer, c'est une bonne idée, ... mais je ne vois pas bien comment m'y prendre.
    Je sens que je vais encore faire une usine à gaz ... tout ca juste pour tester s'il y a du réseau ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  8. #8
    Membre expérimenté
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Par défaut
    Citation Envoyé par Lung
    Je sens que je vais encore faire une usine à gaz ... tout ca juste pour tester s'il y a du réseau ...
    ça me rassure... je suis du genre aussi

    En gros, tu utilise un Thread pour le ping. A ce moment tu lance un Timer.
    Si le Thread ce temine en 1er... tu dévalide le Timer et tu déclanche un évement du Genre EventCestConnecter. Si non, ton Timer indique au Thread que quoi qu'il se passe faut qu'il se la ferme et le Timer declanche un élément du type EventIlSontOuLesBresilien...

    Tu vois le principe ?

  9. #9
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Bon, j'ai un thread et un Timer qui sont lancés.
    - Si le tnsping répond, je coupe le Timer, et je continu.
    - Si le Timer répond, time out : je continu sans tenir compte du thread qui se termine plus tard.

    Ca semble bien fonctionner sous XP.
    Mais, sous NT, avec un interval d'une seconde pour le Timer, ca me mets 30 secondes pour réagir.
    NT est multi-tâches, ou pas ? :
    J'ai l'impression qu'il m'a exécuté mon thread, puis quand il s'est terminé il m'a lancé mon Timer ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Par défaut
    Citation Envoyé par Lung
    Et bien non : encore un problème. si, si ...

    Sous NT, le ping mets 37 secondes environ pour échouer, quand le cable réseau est débranché.
    Pourtant, dans le dernier paramètre de la fonction IcmpSendEcho, j'ai mis 1000 pour un TimeOut d'une seconde.

    Citation Envoyé par MSDN
    Timeout
    [in] Time to wait for replies, in milliseconds.
    Où est l'erreur ?

    : :
    Est que tu fait le ping avec l'adresse IP ou le nom de la machine, auquel cas cela peut prendre du temps car il faut faire la résolution nom -> IP qui peut être impossible si cable débranché d'où délai supplémentaire d'attente de réponse du DNS.

  11. #11
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par cpdump
    Est que tu fait le ping avec l'adresse IP ou le nom de la machine
    Je le faisais avec l'adresse IP.
    Mais maintenant, je fais un TNSPING d'une instance Oracle.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  12. #12
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par Lung
    Bon, j'ai un thread et un Timer qui sont lancés.
    - Si le tnsping répond, je coupe le Timer, et je continu.
    - Si le Timer répond, time out : je continu sans tenir compte du thread qui se termine plus tard.

    Ca semble bien fonctionner sous XP.
    Rectification : le TNSPING dans le thread gèle parfois toutes l'application, ce qui fait que le Timer n'avance plus non plus.
    Donc, le multi-tâche n'exécute qu'une tâche à la fois ...

    Je sèche, là ...
    Personne aurait une idée lumineuse ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  13. #13
    Membre expérimenté
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Par défaut
    Ne connaisant pas l'implémentation du Timer Delphi, et n'ayant pas NT 4 pour faire des test... je te dirait d'éssayer un sleep(1000) pour emplacer le timer

  14. #14
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par /dev/null
    je te dirait d'éssayer un sleep(1000) pour emplacer le timer
    Avec un Sleep, je bloque à coup sûr mon application ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  15. #15
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    A tout hasard, as-tu essayé de libérer la liste des messages Windows avec Application.ProcessMessages ?
    Normalement, un thread en a besoin pour être non bloquant...

  16. #16
    Membre expérimenté
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Par défaut
    Je sous antendait (partant du principe de l'usine à gaz ) un nouveau Thread

  17. #17
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par Sub0
    A tout hasard, as-tu essayé de libérer la liste des messages Windows avec Application.ProcessMessages ?
    Normalement, un thread en a besoin pour être non bloquant...
    Oui.
    Je me suis rendu compte que ca marchait mieux avec (mais c n'empêche pas que c'est pas multi-tache).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       MainForm._Result.bReseau := False;      MainForm._Result.bTimeOut := False;
       Timer.Enabled := True;
       //.Test du réseau dans un thread.
       with TThreadTestReseau.Create(False) do
          OnTerminate := ThreadDone;
     
       //.Attente de réponse.
       while not MainForm._Result.bTimeOut do
          Application.ProcessMessages;
     
       //.Si réseau.
       if MainForm._Result.bReseau then
               // traitement ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  18. #18
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par /dev/null
    Je sous antendait (partant du principe de l'usine à gaz ) un nouveau Thread
    Non, mais si le Timer se bloque, je me demandais si ca valait le coup de faire un 2ième thread.
    J'essairais ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  19. #19
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Perso, je ne me sers pas souvent du composant Thread, j'utilise soit un Timer, soit une simple boucle du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Repeat
      // <- Mon traitement ici -> //
      Application.ProcessMessages;
      Sleep(250);
    Until (Condition);
    En pratique, cela revient au même que l'objet Thread, mis à part que c'est moins précis au niveau du réglage de la priorité. En effet, j'utilise Sleep pour définir la priorité du "thread"... Pour bien faire, il faudrait tenir compte de la puissance du cpu et des ressources disponibles pour ajuster la valeur de Sleep si je veux obtenir une priorité précise... Mais qu'importe, ça fonctionne très bien et cette méthode est bien souvent plus simple à mettre en place... Tu noteras qu'Application.ProcessMessages reste nécessaire quelque soit la méthode choisie.

    C'est toujours du multitâche; Le multi-tâche reste malgré tout des instructions appellées les unes derrières les autres, surtout si le matériel est incapable de réaliser 2 opérations simultannément. C'est pour cette raison qu'il faut définir la priorité d'un thread. Par exemple, une boucle du genre bloquera le système et la charge du cpu sera à 100% même si il ne fait pas grand chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Repeat Until(Condition);
    Ajoute Application.ProcessMessages pour libérer la liste des messages Windows et Sleep pour ralentir la boucle, diminuer le nombre d'itération et par conséquent, diminuer la charge du processeur... à+

  20. #20
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Alors ? Ça fonctionne ?

    _________________

    (Lien tout en bas à gauche de cette fenêtre)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/06/2006, 15h06
  2. [Images] Comment détecter qu'un GIF est animé ?
    Par matique dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 06/02/2006, 16h57
  3. Comment détecter si un tableau est vide ?
    Par ErPi dans le forum Langage
    Réponses: 6
    Dernier message: 27/06/2005, 18h50
  4. Réponses: 15
    Dernier message: 27/04/2005, 10h41

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