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 :

Amélioration vitesse execution programme reseau


Sujet :

C++

  1. #21
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    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
    unsigned long WINAPI  MyThread(LPVOID ip)
    {
        Form1->Memo1->Lines->Add("thread crée");
        PosteDeTravail Poste(ansAddIp);
        Poste.AdresseMac();
        Poste.NomNetbios();
        Poste.Affiche();
        ExitThread(0);
    }
     
     
     for(i=IpDeb;i<=IpFin;i++)
                    {
                            ansIp14 =i;
                            ansAddIp=("");
                            ansAddIp = ansIp11+"."+ansIp12+"."+ansIp13+"."+ansIp14;
                            if (Ping(ansAddIp)==1)
                            {
                                SECURITY_ATTRIBUTES attr;  
                                HANDLE th = 0;
                                th = CreateThread(&attr,0,&MyThread,&ansAddIp, 0,NULL);
                                j++;
                            }
                    }
    Voila donc j'ouvre mon thread et dans la fonction MyThread() je crée un objet poste de travail. Le problème c'est que lorceque je 'appelle la fonction Poste.Affiche() (qui doit m'afficher les différentes informations dans Mon Mémo1, il n'affiche que les dernieres informations.
    Je pense que c'est parceque quand il affiche, il prend les meme informations, car a chaque fois que j'en ai des nouvelles, il oublie celle d'avant.

    Comment puis-je faire autrement svp?

  2. #22
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    je joint un exemple de ce que j'obtiens dans le Memo,

    il crée bien 4 threads?
    Les infos qu'ils affichent sont toutes de ma derniere machine (.54).
    De plus il mélange toutes les infos :s
    Images attachées Images attachées  

  3. #23
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Je peux me tromper mais j'ai l'impression que tu utilises la même instance de string pour toutes tes IP => écrasements successifs de données, et comme toutes les threads la partagent elles voient la même IP. Le mélange vient du fait que les threads voient varier l'IP pendant le parcours de la boucle.
    Utilises un vector de string pour créer autant de string distinctes que de postes.

  4. #24
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    Je ne vois pas comment utiliser std::<vector>string me permetrai de ne pas utiliser a chaque fois la meme adresse ip

  5. #25
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Il faut que tu crée un nouvelle string pour la transmettre à chaque thread que tu crées. Comme tu la transmets par référence, tu dois assurer sa durée de vie. Donc:
    • tu crées ton vecteur en ajoutant toutes les IP avant de boucler (sinon en ajoutant les string en cours de route, les références risquent de s'invalider).
    • Puis tu boucles, et à chaque tour de boucle tu transmets à une thread la référence d'un élément du vector.

    Comme les éléments du tableau sont des instances distinctes, tu n'auras plus de mélange de données.

  6. #26
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    J'éssai d'utilisr les vector string,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     std::vector<string> strIp = new Vector(255);
    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
    if(bflag==true)
            {
                    IpDeb = StrToInt(ansIp14.c_str());
                    IpFin = StrToInt(ansIp24.c_str());
     
                    for(i=IpDeb;i<=IpFin;i++)
                    {
                            ansIp14 =i;
                            ansAddIp=("");
                            ansAddIp = ansIp11+"."+ansIp12+"."+ansIp13+"."+ansIp14;
     
                            strIp(i) = ansAddIp;
     
                            if (Ping(ansAddIp)==1)
                            {
                                SECURITY_ATTRIBUTES attr;
                                HANDLE th = 0;
                                th = CreateThread(&attr,0,&MyThread,&strIp(i), 0,NULL);
                                j++;
                            }
                    }
    je dois me tromper dans l'utilisation de ces vecteurs, mais je ne trouve pas d'exemple pouvant aller dans mon cas sur internet

  7. #27
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par atum25 Voir le message
    J'éssai d'utilisr les vector string,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     std::vector<string> strIp = new Vector(255);
    euh:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     std::vector<string> strIp(255);
    comme ça tu n'as pas à te préoccuper de la gestion mémoire (variable locale, qui est détruite automatiquement en fin de bloc)
    javaiste à la base?

    Pour accéder aux éléments du vector, utilises les crochets [], et non les parenthèses (). Et tu transmets bien à ta fonction la référence de l'élément de vector (pas une copie par exemple...):
    EDIT:
    &(strIp[i])pour + d'info:
    Google {std::vector api}

  8. #28
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    Comment est ce que je rempli après mon vecteur string ?
    J'éssai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     ansAddIp = ansIp11+"."+ansIp12+"."+ansIp13+"."+ansIp14;
               string test;
               test = ansAddIp.c_str();
               strIp[i] = test;
    Mais lorceque je lance mon thread avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    th = CreateThread(&attr,0,&MyThread,&(strIp[i]), 0,NULL);
    Mais il ne rentre jamais dans ma fonction MyThread :s:s:s

  9. #29
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    On ne sait pas ce que tu fais exactement, car tu fournis toujours des extraits de code...
    Pourrais-tu nous montrer ton code COMPLET? Il est probable que tu as une SEGFAULT qui tue tes threads, pour le diagnostiquer on a besoin de voir comment tu t'y prends.
    Et au mini la signature du constructeur de ton objet PosteDeTravail pour savoir ce qu'il attend en entrée...

  10. #30
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    Alors voila ma le code de ma fonction ping, de MyThread et de mon main()

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    unsigned long WINAPI  MyThread(LPVOID ip)
    {
        Form1->Memo1->Lines->Add("thread crée");
        PosteDeTravail Poste(ansAddIp);
        Poste.AdresseMac();
        Poste.NomNetbios();
        Poste.Affiche();
        ExitThread(0);
    }
     
    int TForm1::Ping(AnsiString ansAdressIP)
    {
        HANDLE hIcmpFile;
        char SendData[32] = "Data Buffer";
        DWORD dwRetVal = 0 ;
        LPVOID ReplyBuffer = NULL;
        DWORD ReplySize = 0;
        unsigned long ipadresse;
     
        ipadresse = inet_addr(ansAdressIP.c_str());
        hIcmpFile = IcmpCreateFile();
        if (hIcmpFile == INVALID_HANDLE_VALUE)
        {
           //Form1->Memo1->Lines->Add("Impossible d'ouvrir le HANDLE");
        }
        ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
        ReplyBuffer = (VOID*) malloc(ReplySize);
        if (ReplyBuffer == NULL)
        {
           //Form1->Memo1->Lines->Add("Impossible d'allouer la mémoire");
        }
        dwRetVal = IcmpSendEcho(hIcmpFile,ipadresse,SendData,sizeof(SendData),NULL,ReplyBuffer,ReplySize,1);
        if (dwRetVal != 0)
        {
            PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
            struct in_addr ReplyAddr;
            ReplyAddr.S_un.S_addr = pEchoReply->Address;
            return 1;
        }
        else return 0;
    }
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            AnsiString ansIp11,ansIp12,ansIp13,ansIp14,ansIp21,ansIp22,ansIp23,ansIp24;
            int IpDeb,IpFin;
            bool bflag = true;
            int j=0,i =0;
     
            ansIp11 = Edit1->Text;
            ansIp12 = Edit2->Text;
            ansIp13 = Edit3->Text;
            ansIp14 = Edit4->Text;
            ansIp21 = Edit5->Text;
            ansIp22 = Edit6->Text;
            ansIp23 = Edit7->Text;
            ansIp24 = Edit8->Text;
     
            std::vector<string> strIp(255);
     
            if(bflag==true)
            {
                    IpDeb = StrToInt(ansIp14.c_str());
                    IpFin = StrToInt(ansIp24.c_str());
     
                    for (int z=IpDeb;z<=IpFin;z++)
                    {
                        ansIp14 =z;
                        ansAddIp=("");
                        ansAddIp = ansIp11+"."+ansIp12+"."+ansIp13+"."+ansIp14;
                        string test;
                        test = ansAddIp.c_str();
                        strIp[z] = test;
                    }
     
                    for(i=IpDeb;i<=IpFin;i++)
                    {
                            ansIp14 =i;
                            ansAddIp=("");
                            ansAddIp = ansIp11+"."+ansIp12+"."+ansIp13+"."+ansIp14;
                            //string test;
                            //test = ansAddIp.c_str();
     
                            //strIp.push_back(test);
     
                            if (Ping(ansAddIp)==1)
                            {
                                SECURITY_ATTRIBUTES attr;
                                HANDLE th = 0;
                                th = CreateThread(&attr,0,&MyThread,&(strIp[i]), 0,NULL);
                                j++;
                            }
                    }
                   Memo1->Lines->Add("Fin de scrutation, nombre de poste trouvé : ");
                   Memo1->Lines->Add(j);
            }
    }

    Et voila le code de mon objet PosteDeTravail

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    PosteDeTravail::PosteDeTravail(AnsiString addrIP)
    {
        CAddIp = addrIP.c_str();
        //ulIpAdresse = inet_addr(CAddIp);
    }
     
    void PosteDeTravail::NomNetbios()
    {
        WSADATA wsaData;
        struct in_addr in;
        struct hostent *phe;
        AnsiString HostName;
        WORD wVersionRequested;
     
        AnsiString ansAdressIP = CAddIp;
     
        wVersionRequested = MAKEWORD( 2, 2 );
        WSAStartup( wVersionRequested, &wsaData );
        in.s_addr = inet_addr(ansAdressIP.c_str());
        phe=gethostbyaddr((char *)&in, 4, AF_INET);
        if (phe == NULL)
        {
            CNomNetBios = "Erreur hote introuvable";
        }
        else
        {
            HostName = phe->h_name;
            CNomNetBios = HostName.c_str();
        }
    }
     
    void PosteDeTravail::AdresseMac()
    {
        DWORD dwRetVal;
        IPAddr SrcIp = 0;       // Par default, inutile
        ULONG MacAddr, PhysAddrLen = 6;
        BYTE *bPhysAddr;
        unsigned int i,j;
        unsigned long ipadresse;
     
        ipadresse = inet_addr(CAddIp);
        char * cMacAdd= new char[PhysAddrLen*3];
        char * cMacAddTot = new char[PhysAddrLen*3];
     
        dwRetVal = SendARP(ipadresse, SrcIp, &MacAddr, &PhysAddrLen);
     
        if (dwRetVal == NO_ERROR)
        {
           bPhysAddr = (BYTE *) & MacAddr;
           if (PhysAddrLen)
           {
                for (i = 0, j = 0; i < PhysAddrLen - 1; ++i)
                {
                    j += sprintf (cMacAdd + j, "%02X:", bPhysAddr[i]);
                    strcpy (cMacAddTot,cMacAdd);
                }
                sprintf (cMacAdd + j, "%02X", bPhysAddr[i]);
                strcpy (cMacAddTot,cMacAdd);
           }
            CAddMac = cMacAddTot;
        }
    }
    void PosteDeTravail::Affiche()
    {
            Form1->Memo1->Lines->Add("");
            Form1->Memo1->Lines->Add(CNomNetBios);
            Form1->Memo1->Lines->Add(CAddIp);
            Form1->Memo1->Lines->Add(CAddMac);
    }
    PosteDeTravail::~PosteDeTravail()
    {
     //
    }

  11. #31
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Alors déjà, bien qu'on n'aie pas tout, je suppose à ta manière de l'utiliser que ansAddIp est global => *beeep*!
    Y'a pas mieux pour générer de la confiture de données!
    Par ailleurs, tu construis ton objet PosteDeTravail sur cet objet global. A quoi sert donc ton paramètre ip?

  12. #32
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    J'avais modifier pour fair des tests. (j'ai oublier de remettre ...)

    Déja je n'arrive pas à remplir mon vecteur string =S

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strIp[i] = ansAddIp.c_str();
    Puis lorceque je passe le vecteur en paramètre a mon thread, dans mon thread je le récupère en void*, comment est ce que je peux le récupérer pour m'en servir dans mon constructeur.
    Est ce que je dois l'utiliser en temps que void ou est ce que je dois le modifier ?

  13. #33
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    J'ai refais un exemple plus simple :

    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
    unsigned long WINAPI  MyThread(LPVOID ip)
    {
        cout<<"thread crée"<<endl;
        cout<<ip<<endl;
     
        ExitThread(0);
    }
    main()
    {
              vector<string> SS;
              AnsiString ip;
     
            ip = "192.168.2.";
            for (int i=0;i<20;i++)
            {
                    AnsiString addip;
                    AnsiString nb;
                    nb = i;
                    addip = ip + nb;
                    SS.push_back(addip.c_str());
            }
           for ( int z=0;z<20;z++)
           {
                    cout<<SS[z]<<endl;
                    SECURITY_ATTRIBUTES attr;
                    HANDLE th = 0;
                    th = CreateThread(&attr,0,&MyThread,&SS[z], 0,NULL);
           }
                 system("pause");
    }

    Je créer un vecteur string, je le remplis d'adresse Ip, puis j'éssais de passer ce vecteur en parametre a mon thread.
    Il ne rentre jamais dans la fonction MyThread().

  14. #34
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Que dit le débugger à ce moment?
    As-tu un message d'errreur (genre: segfault) ?

  15. #35
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    J'ai réussi a resoudre ce problème, mais je n'arrive toujours pas a récupérer la valeur du vecteur string que je passe en paramètre a mon thread :s

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <vector>
    #include <string>
    #include <vcl>
     
    using namespace std;
     
     
    unsigned long WINAPI  MyThread(LPVOID ip)
    {
       // cout<<"thread crée"<<endl;
        cout<<ip<<endl;
     
        ExitThread(0);
    }
     
    int main()
    {
        vector<string> SS;
        string ip;
     
        ip = "192.168.2.";
        for (int i=0;i<20;i++)
        {
            string addip;
            string nb;
            nb = i;
            addip = ip + nb;
            SS.push_back(addip.c_str());
        }
        for ( int z=0;z<20;z++)
        {
            //cout<<SS[z]<<endl;
            SECURITY_ATTRIBUTES attr;
            HANDLE th = 0;
            th = CreateThread(NULL, 0, &MyThread, &SS[z], 0, NULL);
    		if (th == NULL)
    	  		cout << "thread n'est pas cree" << endl;
        }
        system("pause");
      }

  16. #36
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Qu'entends-tu par "n'arrive pas"?
    Ton cout te donne un output, je suppose, ce n'est pas ce que tu attendais?
    Je pense que vu que le pointeur est transmis en LPVOID, le compilo ne sait pas quoi en faire, ce qui joue sûrement dans tes déboires.
    Un petit static_cast<string> s'impose en début de fonction MyThread pour remettre les pendules à l'heure, à mon avis...


    Au fait, au passage, si l'utilisation de <string> signifie que tu fais un using namespace std; quelque part, sache que les using globaux sur tout un namespace sont fortement déconseillés, ça perd tout l'intérêt des namespace sur la gestion des conflits de noms, avec la possibilité de chopper des grosses migraines...

  17. #37
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    Au fait, au passage, si l'utilisation de <string> signifie que tu fais un using namespace std; quelque part, sache que les using globaux sur tout un namespace sont fortement déconseillés, ça perd tout l'intérêt des namespace sur la gestion des conflits de noms, avec la possibilité de chopper des grosses migraines...
    Peut-tu m'en dire plus stp ?

    Effectivement il fallait fair un static cast afin que je puisse recupérer mes adresses ip dans mon thread.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    #include <vcl.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <stdlib.h>
    #include <winsock.h>
    #include <iphlpapi.h>
    #include <icmpapi.h>
    #include <vector>
    #include <WinBase.h>
    #include <Windows.h>
    using namespace std;
     
    #pragma comment(lib, "iphlpapi.lib")
    #pragma comment(lib, "ws2_32.lib")
    #pragma hdrstop
    #include "U1_Main.h"
     
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
     char *test;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
     
    unsigned long WINAPI  MyThread(LPVOID ip)
    {
            string* ip_ptr = static_cast<string*>(ip);
            string bis = *ip_ptr;
            unsigned int taille = bis.length();
            test =  new char(taille);
            strcpy(test, bis.c_str());
            PosteDeTravail Poste(test);
            ExitThread(0);
            return 0;
    }
     
     
    int TForm1::Ping(AnsiString ansAdressIP)
    {
        HANDLE hIcmpFile;
        char SendData[32] = "Data Buffer";
        DWORD dwRetVal = 0 ;
        LPVOID ReplyBuffer = NULL;
        DWORD ReplySize = 0;
        unsigned long ipadresse;
     
        ipadresse = inet_addr(ansAdressIP.c_str());
        hIcmpFile = IcmpCreateFile();
        if (hIcmpFile == INVALID_HANDLE_VALUE)
        {
           //Form1->Memo1->Lines->Add("Impossible d'ouvrir le HANDLE");
        }
        ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
        ReplyBuffer = (VOID*) malloc(ReplySize);
        if (ReplyBuffer == NULL)
        {
           //Form1->Memo1->Lines->Add("Impossible d'allouer la mémoire");
        }
        dwRetVal = IcmpSendEcho(hIcmpFile,ipadresse,SendData,sizeof(SendData),NULL,ReplyBuffer,ReplySize,1);
        if (dwRetVal != 0)
        {
            PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
            struct in_addr ReplyAddr;
            ReplyAddr.S_un.S_addr = pEchoReply->Address;
            return 1;
        }
        else return 0;
    }
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            AnsiString ansIp11,ansIp12,ansIp13,ansIp14,ansIp21,ansIp22,ansIp23,ansIp24;
            int IpDeb,IpFin;
            std::vector<string> strIp;
            AnsiString ansAddIp;
            HANDLE th = 0;
            bool bflag = true;
     
            SECURITY_ATTRIBUTES attr;
            int j=0,i =0;
     
            ansIp11 = Edit1->Text;
            ansIp12 = Edit2->Text;
            ansIp13 = Edit3->Text;
            ansIp14 = Edit4->Text;
            ansIp21 = Edit5->Text;
            ansIp22 = Edit6->Text;
            ansIp23 = Edit7->Text;
            ansIp24 = Edit8->Text;
     
            if(bflag==true)
            {
                  IpDeb = StrToInt(ansIp14.c_str());
                  IpFin = StrToInt(ansIp24.c_str());
                  attr.nLength = sizeof(SECURITY_ATTRIBUTES);
                  attr.lpSecurityDescriptor = NULL;
                  attr.bInheritHandle = 0;
     
                  for(i=IpDeb;i<=IpFin;i++)
                  {
                            ansIp14 =i;
                            ansAddIp=("");
                            ansAddIp = ansIp11+"."+ansIp12+"."+ansIp13+"."+ansIp14;
                            if (Ping(ansAddIp)==1)
                            {
                                    strIp.push_back(ansAddIp.c_str());
                            }
                  }
                  int const taille(strIp.size());
                  for(i=0;i<=taille;i++)
                  {
                                th = CreateThread(NULL,0,&MyThread,&strIp[i], 0,NULL);
                                if(th ==NULL){Form1->Memo1->Lines->Add("Impossible de creer un thread");}
                  }
                   WaitForSingleObject(th,5);
                   Memo1->Lines->Add("Fin de scrutation, nombre de poste trouvé : ");
                   Memo1->Lines->Add(taille);
            }
    }
    //---------------------------------------------------------------------------

    Mais le problème c'est que sa ne s'execute jamais de la même facon, défois j'ai le nombre juste d'adresse, défois il m'en rajoute incomplete ( genre : "%s01'4.168.2" ou défois des chaine nuls " " )

    Je ne sais pas si cela viens de mon code ou de l'execution des threads.
    Peut etre devrais-je fais un pool de thread, mais je ne sais pas comment le mettre en place.
    Merci de tes réponses

  18. #38
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par atum25 Voir le message
    Citation Envoyé par therwald
    Au fait, au passage, si l'utilisation de <string> signifie que tu fais un using namespace std; quelque part, sache que les using globaux sur tout un namespace sont fortement déconseillés, ça perd tout l'intérêt des namespace sur la gestion des conflits de noms, avec la possibilité de chopper des grosses migraines...
    Peut-tu m'en dire plus stp ?
    Le type standard c'est std::string. Je suppose que si tu écris string partout c'est peut-être suite à l'"astuce" donnée un peu partout sur le net de mettre using namespace std; en début de fichier. Ce n'est pas une bonne idée de prendre l'habitude d'écrire ce type de directive, parce qu'elle transvase toutes les classes du namespace dans le scope de ton fichier comme s'il n'y avait pas de namespace. Le soucis avec ça c'est que si tu fusionne des namespaces en veux-tu en-voilà, tu vas finir par avoir des conflits entre classes du même nom, parce que les namespaces sont justement conçus pour créer un container qui empêche que deux classes qui ont le même nom de base et sont définies pour des contextes différents entrent en conflit de nom. Après tu commences à maîtriser beaucoup moins bien comment le compilateur identifie les classes et ça peut rapidment faire des sacs de noeuds...
    voir http://cpp.developpez.com/faq/cpp/?page=namespace pour des infos sur les namespaces

  19. #39
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par atum25 Voir le message
    Mais le problème c'est que sa ne s'execute jamais de la même facon, défois j'ai le nombre juste d'adresse, défois il m'en rajoute incomplete ( genre : "%s01'4.168.2" ou défois des chaine nuls " " )

    Je ne sais pas si cela viens de mon code ou de l'execution des threads.
    Peut etre devrais-je fais un pool de thread, mais je ne sais pas comment le mettre en place.
    Merci de tes réponses
    Le pool n'est pas en question ... c'est une optimisation qui n'est pas forcément nécessaire ni même bénéfique ici, et il vaut mieux d'abord assurer la correction du code.
    Ce résultat instable indique que tu as encore du partage de données entre threads.
    Je vois que tu fais encore des new et de la manipulation de char**, je te conseille de tout faire par std::string (quitte à créer les copies nécessaires en std::string pour éviter de compter sur un objet mort) et d'utiliser string::c_str() au dernier moment avant chaque appel d'API. Ca évite les erreurs de pointeurs et de débordements qui tournent au jardinage mémoire.
    Ensuite, ta thread principale (celle qui remplit le vector d'adresses IP qui pingent) doit cesser définitivement de modifier le vector et les contenus de string avant de commencer à créer les threads pour être sûr que les références restent valides (en lisant vite ça a l'air d'être le cas, mais bon...).
    Pour départager un bug de ton code d'un bug de threading, fais un affichage de la liste d'IP avant de commencer le sondage.
    Enfin, sois certain d'avoir viré toutes les variables globales et statiques, en programmation avec thread c'est l'ennemi (interactions imprévisibles...)

  20. #40
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par défaut
    Je suis entrain de regarder toutes tes remarques !!

    Comment ce fait-til que je ne puisse pas utiliser les fonctions de std::string pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string* ip_ptr = static_cast<std::string*>(ip);
    Si j'essaye de fair par exemple ip_ptr.c_str(), j'ai une erreur "Structure required on left side of . or.*"

    J'essaye de copier ce string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string bis  ;
            bis = *ip_ptr;
    Mais j'ai une exeption qui ce leve a chaque fois de type "bad_alloc"

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Execution programme session fermée
    Par oligig dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 06/09/2005, 11h24
  2. Execution programme et récupération du code retour
    Par Dr_GonZO dans le forum Langage
    Réponses: 5
    Dernier message: 12/07/2005, 16h20
  3. [Kylix] probleme execution programme
    Par vin's dans le forum EDI
    Réponses: 1
    Dernier message: 31/03/2004, 13h25
  4. Programme reseau en c++
    Par schnito dans le forum Windows
    Réponses: 3
    Dernier message: 14/01/2004, 01h44
  5. programmation reseau - couche 2 du modele osi
    Par sahor dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/11/2002, 19h33

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