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

VB 6 et antérieur Discussion :

[VB6] Sortir d'une classe par gestion d'évènement (Timer) externe ...


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut [VB6] Sortir d'une classe par gestion d'évènement (Timer) externe ...
    Bonjour,

    Je but sur un problème assez complexe :
    Mon application appelle une classe qui par moment ne répond pas (je détaille plus loin).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    .........
    ' Recherche une nouvelle version à l'adresse sUrl_AutoUpdate
    ' défini dans le fichier ini
    If AppUpdate.AutoUpdate("", sUrl_AutoUpdate, app.Path, app.ExeName, _
                 Global_NumeroVersion, sUseAuthentification_ProxyFW) Then
        End
    End If
    Set AppUpdate = Nothing
    .....
    Ma classe vérifie via http sur un serveur si des mises à jour sont nécéssaires et les télécharges (Merci Thierry ). Tout fonctionne correctement sauf un cas particulier :
    Quand le serveur est super lent à répondre (pas quand il est tombé), ma classe met une plombe à tourner ... et donc le programme ne répond pas
    Donc ce que je voudrais, c'est pouvoir gérer un événement par Timer pour pouvoir fermer et tuer la classe au bout d'un certain temps.

    Une fois que la classe est en cours, impossible d'en sortir ...
    J'ai bien essayer d'adapter le code source de la classe, mais sans succès.

    Merci d'avance pour votre aide !

    PS : Voici un exemple de se que fait ma classe de mise à jour :
    http://www.developpez.net/forums/showthread.php?t=92203

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    peut-tu modifierle AppUpdate?

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    Quelques précision sur ce que je voudrais faire dans ma classe :
    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
     
    Public WithEvents fSecurityTimer As Timer
    ....
    Public Function AutoUpdate(...)
     ..... 
        'Création du Timer
        'Set fSecurityTimer = New Timer  'Impossible d'initialiser le timer !!! Ne fonstionne pas
        fSecurityTimer.Interval = 2000
        fSecurityTimer.Enabled = True
        'Gestion du temps de téléchargement pour éviter les problèmes !!!
        lStartTime = GetTickCount()
     '------------------------------ 
        'Mon Bloc qui pose problème ...
     '------------------------------ 
        'Fermeture du Timer
        Set fSecurityTimer = Nothing
        fSecurityTimer.Enabled = False
     ..... 
    End function
     ..... 
    Private Sub fSecurityTimer_Timer()
        lCurrentTime = GetTickCount()
        'On vérifie au cas où que le téléchargement n'est pas bloqué
        If (lCurrentTime > (lStartTime + lMonTimedOut)) Then
            'On coupe le téléchargement
            bTimeOut = True
            fSecurityTimer.Enabled = False
      ...
        End If
    End Sub
    Mais cela ne fonctionne pas !!!

    Merci d'avance pour votre aide

    ++

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    est-ce que la réponse est bloqué sur une boucle dans "'Mon Bloc qui pose problème ..." ?

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    Dans mon 2 ème message, l'exemple de code que j'essaye de faire ne fonctionne pas ("erreur de compilation , mauvaise utilisation du mot New").
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set fSecurityTimer = New Timer    'Non valide à la compilation
    En fait, je crois qu'il faudrait faire du "subclassing" mais je pas comment subclasser une classe ...

    Existe-t-il un moyen de faire ce que je souhaite sans un object "Timer" qui nécessite d'être poser sur une form ? Le lien mis dans mon premier post devait le permettre (la classe Minuteur) mais ce n'est pas le cas.


    Merci de votre aide.

  6. #6
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Salut,

    Ya une erreur au niveau de la fermeture du timer !!!!!!!

    Tu détruits "fSecurityTimer" et après tu affectes une valeur à la propriété "enabled" ?????

    Remplace ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        'Fermeture du Timer
        Set fSecurityTimer = Nothing
        fSecurityTimer.Enabled = False
    par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        'Fermeture du Timer
        fSecurityTimer.Enabled = False
        Set fSecurityTimer = Nothing
    
    +

    Théo

  7. #7
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    Ya une erreur au niveau de la fermeture du timer !!!!!!!
    Erreur de frappe ! Merci

    Par contre, c'est au début que ça ne passe pas (je pense que nos post ce sont croisés )!

    Comment créer / initialiser l'objet Timer sans qu'il existe sur un form ... ?
    (Sais pas trop si je suis clair )

    ++

  8. #8
    Membre actif Avatar de AdHoc
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 245
    Points : 239
    Points
    239
    Par défaut
    bonjour,
    malheureusement, je ne crois pas.
    Citation Envoyé par Aide VB
    Chaque contrôleTimer doit être associé à une feuille. Pour créer une application minuterie, vous devez donc créer au moins une feuille (vous n'êtes pas obligé de rendre cette feuille visible si vous ne l'utilisez pas par ailleurs).
    Note Le terme « Timer » est utilisé de plusieurs façons dans Visual Basic. Chacune d'elle est étroitement liée au travail du contrôle Timer. Le terme « Timer », faisant déjà référence au nom et au type du contrôle, est également utilisé pour décrire l'événement et la fonction Timer.

  9. #9
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    bonjour,
    malheureusement, je ne crois pas
    Comment peut-on gérer alors des évènements sur le temp dans des modules ou des classes ???
    Il doit forcément exister une solution sur ce type de problème car le besoin me parait énorme !!!

    Je continue de chercher !
    Encore merci pour votre aide.

    ++

    EDIT :
    Mon problème est décrit également sur le lien suivant :
    http://www.codecomments.com/archive2...11-702738.html

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Regarde ce que tu peux faire avec ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public ghwnd As Long, kHwnd As Long, uId As Long, fin As Boolean
    Declare Function SetTimer Lib "user32" (ByVal ghwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Declare Function KillTimer Lib "user32" (ByVal kHwnd As Long, ByVal nIDEvent As Long) As Long
     
    Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Ces déclarations sont à placer dans un module (!)

    Pour l'activer depuis une form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub UserForm_Activate()
        If Val(Application.Version) < 9 Then
                uId = SetTimer(ghwnd, 0, 1, AddressOf97("GetPressedKey"))
            'Else
                'SetTimer ghwnd, 0, 1, AddressOf GetPressedKey
        End If
    End Sub
    Pour l'arrêter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub ArrêterTimer()
        KillTimer kHwnd, uId
    End Sub
    Je n'ai pas mis tout le code mais le démarrage du timer se fait ici sur la frappe d'une touche et je ne pense pas que ça t'intéresse.

    A toutes fins utiles et à tout hasard

    Si tu as besoin d'explication... pour VB je ne pourrai malheureusement t'être d'aucune aide

    Bonne chance

  11. #11
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    le problème est qu'il veut l'activer depuis le module...

  12. #12
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Et pourquoi ne pas utiliser une form invisible ?
    Sur laquelle se trouve le timer...

    juste une idée

    +

    Théo

  13. #13
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    ouskel'n'or, merci de ton aide, mais ça n'est pas utilisable dans mon cas.

    Et pourquoi ne pas utiliser une form invisible ?
    Sur laquelle se trouve le timer...
    Car je ne sais pas ensuite comment je pourrais "tuer" la classe quand elle se bloque.

    J'ai trouvé pas mal d'exemple de "Timer without form", le problème c'est que ceux qui fonctionne correctment n'ont pas de gestion d'évènement ... ou alors sont payant .

    Je continue à chercher

    Encore merci pour votre aide.

  14. #14
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    juste une question, ta procédure qui vérifie un fichier sur le serveur se bloque tant qu'elle n'a pas reçut de réponse, mais peut-tu la modifier (je suppose que la réponse est non, mais bon, on sait jamais...)

  15. #15
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    J'utilise les api Wininet donc je maitrise pas leur réaction ...

    De plus, je veux persister sur ce sujet car je pense qu'un composant "Timer" global, qui peut permettre de gérer des évènements indépendemment des forms, classes et autres, peut intérressé bcp de monde.

    Je continue de chercher !
    Merci pour votre aide.

    ++

    EDIT :
    En plus du lien intérressant dans mon premier post, le lien suivant me parait intérressant :
    http://www.thevbzone.com/s_modules.htm
    Regarder le module modTimer.bas ainsi que la classe cTimer.cls
    Je ne sais pas par contre ajouter un évènement à cette classe


    Bref, avec tout ça, on va bien finir pas trouver qqchose de stable
    Merci d'avance de votre aide

  16. #16
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    J'ai peut-être trouvé mon bonheur !!!

    http://www.codeguru.com/vb/gen/vb_sy...cle.php/c1665/

    Je teste et j'édite.

    ++

    EDIT : ce dernier exemple semble fonctionner
    Il faut que j'approfondisse les tests !

    Par contre, il me reste un souçis : Comment "tuer" la classe ou fonction en cours d'exécution ?

    Voici le code résultant (les modules de classe sont dans le lien ci dessous)
    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
     
    Public WithEvents fSecurityTimer As CTimerReplacement
    ....
    Public Function AutoUpdate(...)
    ..... 
        'Gestion du temps de téléchargement pour éviter les problèmes !!!
        lStartTime = GetTickCount()
        'Création du Timer
        Set fSecurityTimer = New CTimerReplacement
        fSecurityTimer.Start (1000)
    '------------------------------ 
        'Mon Bloc qui pose problème ...
    '------------------------------ 
        'Fermeture du Timer
        fSecurityTimer.StopTimer
        Set fSecurityTimer = Nothing
    ..... 
    End function
    ..... 
    Private Sub fSecurityTimer_OnTimer()
        lCurrentTime = GetTickCount()
        'On vérifie au cas où que le téléchargement n'est pas bloqué
        If (lCurrentTime > (lStartTime + lMonTimedOut)) Then
            'On coupe le téléchargement
            bTimeOut = True
            fSecurityTimer.StopTimer
           'Set AutoUpdate = Nothing
           'Reste à fermer la fonction AutoUpdate ?????
        End If
    End Sub

  17. #17
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par marsup54
    Comment "tuer" la classe ou fonction en cours d'exécution ?
    ha! je comprend tout...
    je me demandais comment tu comptais le faire. j'ai ma réponse .

    plus serieusement je ne vois vraiment pas comment faire, mais je ne suis pas un pro.

  18. #18
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    ha! je comprend tout...
    je me demandais comment tu comptais le faire. j'ai ma réponse .


    plus serieusement je ne vois vraiment pas comment faire, mais je ne suis pas un pro.
    J'ai encore un peu de mal pour ma part avec les Events et autre ...

    Je pense qu'il va falloir faire dans la classe, une fonction du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AutoUpdate_Terminate() ou AutoUpdate_Close()
    Mais je vois pas trop comment faire ...

    Merci d'avance pour votre aide

    ++

  19. #19
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    Faux espoir pour le Timer ...
    Celui-ci fonctionne bien mais fait un Wait ... et ne rends donc pas la main !!!

    M'enfin, le principe reste le même. A moi de retrouver une nouvelle classe qui gérera correctement ce Timer.

    Par contre la question :
    Comment "tuer" la classe ou fonction en cours d'exécution ?
    reste valable !

    ++

  20. #20
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    J'ai toujours lu qu'il fallait toujours éviter si possible de sortir par les fonctions de classe : Class_Terminate() ... donc suis un peu perdu

    Il faut à mon avis que ma classe gère un évènement qui serait activer par mon Timer lorsque l'on est en TimedOut (Timer qui pour l'instant ne fonctionne plus non plus ... ).

    Le problème, c'est que j'avoue ne pas trop maitriser les évènement dans les classes ...
    Si y'avait un bon tuto là dessus, ça serait cool !

    Je continue mes recherches !
    Merci de votre aide

    ++

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/04/2007, 15h26
  2. Réponses: 3
    Dernier message: 25/02/2007, 18h49
  3. Réponses: 8
    Dernier message: 19/10/2006, 15h41
  4. [css]Sortir d'une classe en css
    Par tiger33 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 12/09/2006, 15h42
  5. [Tableau][Base]Création d'une classe de gestion de tableau
    Par mariogarcia dans le forum Collection et Stream
    Réponses: 40
    Dernier message: 05/11/2005, 01h19

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