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 :

question sur 'threads' et 'random'


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2004
    Messages : 23
    Points : 12
    Points
    12
    Par défaut question sur 'threads' et 'random'
    Salut!!!

    Je suis en utilisant 'randomize' avant de lancer les fils (threads) et en chaque fil je suis en utilizant 'random', mais le nombre généré est egal pour tous mes fils. Alors Comment je peux faire pour générer nombres aléatoires differents dans chaque fil?.
    Je suis en travaillant avec l'API de Windows sur C++ Builder 4.0

    Merci...

  2. #2
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    J'ai créé 10 threads et fait comme toi: un randomize() avant de les lancer, mais pour moi j'obtiens bien 10 nombres aléatoires indépendants.

    Es tu sur de ce que tu affiches ?
    Comment vérifis tu ces nombres ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2004
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Je suis en utilisant le random dans le corps de chaque fil (méthode DWORD WINAPI function(void *)), j'ai plusieurs fils et je suis en affichant le nombre de chaqu'un avec une structure independant (liste) ainsi:
    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
     
    randomize();
     
    for(int i=0;i<n_fils;i++){//nombre de fils à crèer
     
    d_param=anx_liste(d_param,cad,0);//Anexer noeuds à une liste dinámique
     
    //Trouver le dernier noeud
    dernier=d_param;
    while(dernier->suivant!=NULL){
    dernier=dernier->suivant;
    }
     
    //Créer le fil avec le dernier noeud de la liste comme parámetre
    dernier->id_fil=CreateThread(0,0,function,dernier,CREATE_SUSPENDED,NULL);
    if(dernier->id_fil==NULL){
    ShowMessage("Erreur");
    d_param=elimliste(d_param);
    Application->Terminate();
    }
    //Demarrer le fil
    ResumeThread(dernier->id_fil);
     
    }
     
    //Attendre tous les fils
    liste aux=d_param;
    while(aux!=NULL){
    WaitForSingleObject(aux->id_fil,INFINITE);
    aux=aux->suivant;
    }
     
     
    /***** function du fil *******/
    DWORD WINAPI function(void *x){
     
    liste p=(liste)x;
    double sum=0;
    p->resp=random(100);
    ExitThread(0);
    return NULL;
    }
    /****************/
    A l'heure de parcourrir la liste tous les parámetres 'resp' de chaque fil ont le même valeur.

    Qu'est ce que je suis en faisant mal?

    Merci...
    Pense a mettre les balises de code le # en haut a droite, ce sera plus agreable a lire pour tous

  4. #4
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Je ne vois pas où tu écris dans "dernier->suivant", le problème se situe plutôt au niveau de ta liste chaînée je pense.

    Voilà mon code pour la création de threads, si ca peux t'aider. Mais je ne pense pas que le problème vienne de là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            for (i = 1; i < 20; i++)
            {
                if ( (thread_id = _beginthread(thread_code,4096,(void *)i) ) == -1)
                {
                   Memo2->Lines->Add("Unable to create thread"+ IntToStr(i)+", errno = "+IntToStr(errno));
                }
                Memo2->Lines->Add("Thread "+ IntToStr(i)+ " Created " +", ID = "+IntToStr(thread_id));
            }
    et le code des threads:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            for ( int x=0 ; x<Form1->ControlCount ; x++)
            {
                if(Form1->Controls[x]->Name == "Edit"+IntToStr(PID))
                    ((TEdit*)Form1->Controls[x])->Text = "random = "+IntToStr(random(100));
            }
    Le code du thread cherche le composant TEdit lié à son ID pour y afficher son random.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2004
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Salut!!!

    encore rien...

    J'ai fait exactement le même code et rien.

    Tout le code est le suivant:

    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #include <process.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    void thread_code(void *);
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      unsigned long thread_id;
      int i;
      randomize();
     
      for (i = 1; i < 20; i++)
      {
          if ( (thread_id = _beginthread(thread_code,4096,(void *)i) ) == -1)
          {
             Memo2->Lines->Add("Unable to create thread"+ IntToStr(i)+", errno = "+IntToStr(errno));
          }
          Memo2->Lines->Add("Thread "+ IntToStr(i)+ " Created " +", ID = "+IntToStr(thread_id));
      }
     
    }
    //---------------------------------------------------------------------------
     
    void thread_code(void *x){
     
      int PID=(int)x;
     
      for ( int x=0 ; x<Form1->ControlCount ; x++)
      {
          if(Form1->Controls[x]->Name == "Edit"+IntToStr(PID))
              ((TEdit*)Form1->Controls[x])->Text = "random = "+IntToStr(random(100));
      }
    }
    //---------------------------------------------------------------------------
    et dans le formulaire j'ai 19 composants TEdit et dans chaqu'un "random = 46", dans le TMemo il y a 19 Threads avec ID's differents.

    Alors, Qu'est ce que je dois faire?

    Merci...

  6. #6
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Et si tu ajoutes un randomize() avant de faire ton random(100) dans chaque thread, tu as le même problème.

Discussions similaires

  1. Question sur le programme Random
    Par domxaline dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 17/05/2010, 18h34
  2. Question sur Thread::Sleep()
    Par Ren97 dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 18/09/2009, 13h37
  3. Questions sur thread-safe
    Par cdrc78 dans le forum Struts 1
    Réponses: 1
    Dernier message: 19/01/2007, 11h16
  4. une question sur thread
    Par LN(a) dans le forum Delphi
    Réponses: 5
    Dernier message: 04/09/2006, 11h32
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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