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

Threads & Processus C++ Discussion :

Problème Création-Passage de paramètre Thread


Sujet :

Threads & Processus C++

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

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut Problème Création-Passage de paramètre Thread
    Bonjour a tous,

    Voila j'éssai de créer un thread et de lui passer un vecteur string en paramètre.

    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");
    }
    J'ai refais un code simplifier, ou je cree un vecteur, le rempli d'adresse Ip, et passe ce vecteur en paramètre a mon thread.
    Mais il ne rentre jamais dans ma foinction MyThread.
    Voila si quelqu'un sait pourquoi.
    Merci a tous !!

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Points : 55
    Points
    55
    Par défaut
    Tu n'as pas initialisé les attributes, modifie la ligne comme ça (les attributes sont éliminés):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    th = CreateThread(NULL, 0, &MyThread, &SS[z], 0, NULL);
    Voila du code entier qui marche chez moi (AnsiString replacé par string):
    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
     
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <vector>
    #include <string>
     
    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");
     
    	return 0;
    }

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

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Ce code marche cher toi ?
    Moi lorceque je le compile, la ligne :ne m'affiche pas l'adresse Ip, mais un numéro (ex: 32126024)

    J'aimerai dans le thread pouvoir recuperer l'adresse Ip :s

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Points : 55
    Points
    55
    Par défaut
    Le thread est créé, c'est ce que je voulais dire. Si tu veux afficher, tu dois faire le "cast" (je sais pas comment dire ça en français):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    unsigned long WINAPI  MyThread(LPVOID ip)
    {
        cout<<"thread crée"<<endl;
        string* ip_ptr = static_cast<string*>(ip);
        cout<< *ip_ptr <<endl;
     
        ExitThread(0);
    }
    Comme ça, tu affiche pas l'adresse mais le string meme.

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

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    Effcetivment frace au cast, cela me permet d'afficher le string en lui meme.

    Mais cela ne marche pas a chaque fois, en effet sur environ 100 poste, cela va marcher et m'afficher correctement le poste environ 90fois, et 10 fois ou l'addresse sera imcomplete ou alors avec des symboles etrange :s.

    je te remet mon 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
    17
    unsigned long WINAPI  MyThread(LPVOID ip)
    {
        std::string bis;
        try
        {
            std::string* ip_ptr = static_cast<std::string*>(ip);
            bis = *ip_ptr;
            Form1->Memo1->Lines->Add(bis.c_str());
        }
        catch ( std::bad_alloc & )
        {
            Form1->Memo1->Lines->Add("erreur allocation memoire");
        }
        PosteDeTravail Poste(bis.c_str());
        ExitThread(0);
        return 0;
    }
    Voici 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
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            AnsiString ansIp11,ansIp12,ansIp13,ansIp14,ansIp21,ansIp22,ansIp23,ansIp24;
            int IpDeb,IpFin;
            std::vector<std::string> strIp;
            AnsiString ansAddIp;
            HANDLE th = 0;
            bool bflag = true;
     
            SECURITY_ATTRIBUTES attr;
            int 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-1;i++)
                  {
                                th = CreateThread(NULL,0,&MyThread,&strIp[i], 0,NULL);
                                if(th ==NULL){Form1->Memo1->Lines->Add("Impossible de creer un thread");}
                                //WaitForSingleObject(th,10);
                  }
     
                   Memo1->Lines->Add("Fin de scrutation, nombre de poste trouvé : ");
                   Memo1->Lines->Add(taille);
            }
    }
    voici l'appel du thread.

    JE l'appelle toujours avec le même type de parametres :s:s

Discussions similaires

  1. Réponses: 19
    Dernier message: 09/06/2006, 10h03
  2. Problème de passage de paramètres à une procedure
    Par momo62 dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 22/12/2005, 15h22
  3. [template] problème de passage de paramètres
    Par vinny_the_true dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2005, 01h15
  4. Réponses: 9
    Dernier message: 13/05/2005, 03h13
  5. problème de passage de paramêtre sous mozilla
    Par mat10000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/09/2004, 10h48

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