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++Builder Discussion :

Pourquoi un Access Violation ? [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut Pourquoi un Access Violation ?
    Bonjour,

    J'ai réalisé ce petit bout de code :
    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
     
            TList *ListeThread = IdIRCServer1->Threads->LockList();
            for( int i=0; i<ListeThread->Count; i++ )
            {
                    try
                    {
                            TIdPeerThread *Thread = (TIdPeerThread*)ListeThread->Items[i];
                            Thread->Connection->WriteLn( "PING MaTHieU" );
                    }
                    catch( ... )
                    {
                            TIdPeerThread *Thread = (TIdPeerThread*)ListeThread->Items[i];
                            Thread->Stop();
                    }
            }
            IdIRCServer1->Threads->UnlockList();
    J'ai un access violation à la première ligne dans ntdll.dll mais je ne comprend pas pourquoi...

    erci d'avance,
    Mathieu

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Regarde voir la valeur de retour de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IdIRCServer1->Threads->LockList();
    Je ne connais pas cette fonction mais peut être que LockList ne te retourne pas un pointeur sur la liste mais qu'il se contente de la bloquer.

    Dans tous les cas essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IdIRCServer1->Threads->LockList();
    ListeThread = IdIRCServer1->Threads;
    // Ou bien avec Assign si ça existe

  3. #3
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut yop
    Salut,

    Voici ce que j'ai dans l'aide :
    TIdTCPServer.Threads
    TIdTCPServer, See Also
    Container for peer threads connecting to the server.
    property Threads: TThreadList;
    Description
    Threads is a read-only TThreadList property that acts as a container for TIdPeerThread items created in the listener thread.
    J'avais pas pensé à cette éventualité

    Je regarde ce midi à la maison et vous tien au courant !

    Merci,
    Mathieu

  4. #4
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    bonjour,

    la méthode LockList() descend de la classe TThreadList
    cette méthode empêche q'un autre thread utilise cette liste et elle te retourne un ptr sur sur une TList

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TList* __fastcall LockList(void);
    mais si comme je le suppose la threadList est vide (valeur NULL) l'appel a LockList va provoquer forcément un Access Violation

    pour le tester modifie ton code de la manière 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
     
    try
      {
       TList *ListeThread = IdIRCServer1->Threads->LockList();
       for( int i=0; i<ListeThread->Count; i++ )
        {
          try
          {
                  TIdPeerThread *Thread = (TIdPeerThread*)ListeThread->Items[i];
                  Thread->Connection->WriteLn( "PING MaTHieU" );
          }
          catch( ... )
          {
                  TIdPeerThread *Thread = (TIdPeerThread*)ListeThread->Items[i];
                  Thread->Stop();
          }
        }
        IdIRCServer1->Threads->UnlockList();
      }
      catch(EAccessViolation &E)
      {
       MessageBox(Handle,E.Message, "Exception Occurs", MB_OK + MB_ICONSTOP);
      }
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut yop
    Salut,

    Je vais regarder tout ça ce midi cependant, je peux déjà affirmer que ma ThreadListe n'est pas vide car j'ai une connection sur le serveur (détectée avec OnConnect et OnDisconnect)

    Merci,
    Mathieu

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Par défaut
    et pourquoi pas plus simplement,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TList *ListeThread = IdIRCServer1->Threads->LockList(); 
    if(ListeThread != NULL)
    {
       // ton traitement
    }

  7. #7
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut yop
    Salut,

    Moi, j'ai l'exception à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TList *ListeThread = IdIRCServer1->Threads->LockList();
    Cordialement,
    Mathieu

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Vu le nom, ça m'a l'air d'être un composant Indy.
    Tu as la dernière mise à jour des composants Indy ?

  9. #9
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut yop
    Salut,

    C'est en effet un composant Indy v9.0.17. Je n'ai pas réussi à compiler la version 9.0.18 et la v10 n'est pas encore compatible C++ Builder 6.

    Merci,
    Mathieu

  10. #10
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    bonjour,
    la liste Threads existe elle fait partie du component en tant que property,mais comme je l'ai déclaré dans un précédent Post

    ce n'est pas une simple TList mais une Liste adaptée au Thread (ThreadList)
    l'execption proviend au moment ou un veut faire un locckList

    le fait d'assigner a un ptr TList une autre liste ne provoque pas d'access violation

    par contre si la ThreadList est vide ou NULL --> AccessViolation

    un petit test avant le locker la list serait le bienvenu du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     if(IdIRCServer1->Threads)
    {
       ..traitement
    }
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  11. #11
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut yop
    Salut,

    Merci pour votre aide, cependant, même cette ligne seule provoque une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IdIRCServer1->Threads->LockList();
    Et, il y a une connection sur le serveur donc la liste de thread n'est pas vide.

    Merci d'avance,

    Cordialement,
    Mathieu

  12. #12
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    observe le composant au debugger avant l'appel a LockList
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

Discussions similaires

  1. Depuis EDI DELPHI : Access Violation
    Par powerlog dans le forum EDI
    Réponses: 1
    Dernier message: 03/08/2005, 16h59
  2. Access violation avec fseek
    Par baleine dans le forum C
    Réponses: 7
    Dernier message: 18/03/2005, 16h41
  3. Réponses: 7
    Dernier message: 22/02/2005, 13h07
  4. [DELPHI][PROECEDURES STOCKES] Access violation
    Par All Jinx dans le forum Bases de données
    Réponses: 6
    Dernier message: 14/05/2004, 15h57
  5. Réponses: 3
    Dernier message: 22/05/2002, 09h37

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