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

Visual C++ Discussion :

Affichages sur liste de deux instances, fonction qui va bien ?


Sujet :

Visual C++

  1. #1
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut Affichages sur liste de deux instances, fonction qui va bien ?
    Bonjour,



    Je voudrais afficher dans une List Box, les problèmes rencontrés lors de l'initialisations
    des caméras (Hardwares) ( il y en a deux maximum).
    -Je vous explique generalement le prorgamme:
    Mon programmme travaille en Multithreads. Tout d'abord, j'ai quelques petits soucis car
    l'affichage des erreurs tarde à venir mais ça je pense que c'est du au fait que j'utilise une fonction
    'Ontimer(UINT nIDEvent)' durant la phase d'affichage des erreurs à l'initialisations. Mais bon ce problème je le traiterai
    après.
    Maintenant au niveau de l'affichage, il est question de 2 caméras et il faut
    les initialiser et afficher leurs erreurs d'init ( mauvais fichier chargé pour les caméras ou caméra débranchées)
    Au depart je n'avais qu'une seule caméra et l'affichage se fesait très bien,
    actuellement j'en utilise deux et donc je suis amener à changer les fonctions.
    J'ai une classe 'CViewSYSInitialisation' dont la fonction 'Ontimer(UINT nIDEvent)'
    fait appel à une autre fonction d'une autre classe générale CMy99090DOC' cette derinere
    fonction renvoit les instanciations des 2 caméras (m_pThreadHardware1 et m_pThreadHardware2)
    qu'elle aura recuperer de la classe Hardware cette dernière classe
    enregistrera, avec sa fonction 'Init()', l'initialisation des caméras et enregistrera donc des erreurs d'init des
    chaques instances des caméras dans leurs variables 'm_initHardwarestatus'.
    -Après ces explications, mes questions:
    En effet j'ai dans ma fonction 'isProblemHardware()' qui est apellée par cette
    variable ''initHardwarestatus' de la fonction 'Ontimer(UINT nIDEvent)'
    un retour d'un entier. Ce entier retourné est évaluée dans la fonction appellante par un switch
    puis en fonction des différents case: je fais un Addstring sur ma liste box.
    La fonction tel que je l'ai fait marche mais n'est pas très professionnelle
    car elle renvoit les erreurs d'init que d'une des cameras ( celle qui se serait initialisée la
    première) comment puis-je savoir lors de l'appel de cette fonction quelle instanciation donner
    à la fonction appellante?

    -Codes:

    On peut dire que les codes se divisent en 2 parties : - INITIALISATIONS HARDWARES
    - AFFICHAGES DES PROBLEMES D'INIT HARDWARE
    Les principales instances et variables : - m_initHardwarestatus
    - m_pThreadHardware1
    - m_pThreadHardware2

    -----------------------------------------------
    -----------------------------------------------
    INITIALISATIONS HARDWARE
    -----------------------------------------------

    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
     
     
    int CMy99090Doc::Process(unsigned int uiProcess)
    { 
     try
     {
      CString cstrFichier=m_Init.Get_Params_ACDAS_File();
      if(cstrFichier.Compare ("")==0)
       return 1;
      switch (uiProcess)
      {
     
    case PROCESS_DIVERS_ACQUISITION:  // autre process
     
         ......... (codes inutiles)
    case PROCESS_SYS_AUTOMATIQUE:    // notre process
           if(m_Init.Get_Params_SYS_Config_Securiy() & LEVEL_4)   // securité et niveau dans lequel on travaille     
        { 
         m_pThreadHardware1= new CThreadHardware(0);    // Thread initalisation de la caméra 1
         TRACE("Début tache BestCam principale1\n"); 
         m_pThreadHardware1->CreateThread(NULL,0);       
     
           if(m_Init.Get_Params_SYS_Config_Securiy() & LEVEL_BI)   
                                          {
            Sleep(10000);
          m_pThreadHardware2= new CThreadHardware(1);     
         TRACE("Début tache BestCam principale2\n"); 
         m_pThreadHardware2->CreateThread(NULL,0);      
         }
        }
        if(m_pThreadDispatcher)   // Thread qui dispatche les autres Threads
        { 
         m_pThreadDispatcher->Thread_Stop();
         delete m_pThreadDispatcher;
         TRACE("fin tache Dispatcher case ACDASSYSautom\n");//4
         m_pThreadDispatcher=0;
        }
                                 m_pThreadDispatcher= new CThreadDispatcher 
        ( m_Init.Get_Params_ACDAS_File(),
         this,
         m_pThreadWago1,        // pour la comminication avec differents peripheriques     
         m_pThreadWago2,
         m_pThreadHardware1,    // camera 1
         m_pThreadHardware2,    //  camera 2
         THREAD_ACQUISITION | THREAD_TRAITEMENT 
         | THREAD_AUTOMATIQUE
        );
        TRACE("Début tache Dispatcher case ACDASSYSautom\n");//4    
        m_pThreadDispatcher->CreateThread(NULL,0); 
     
    int CThreadHardware::Init_BestCam()
    {
     m_initHardwarestatus=m_pHardware->Init();
     if(m_initHardwarestatus)
     {
     
      TRACE("Erreur Init_BestCam\n"); 
                   Set_Status(STATUS_PROBLEME);
      return 1;
     }
     return 0;
    }
    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
     
     
    int CHardware::Init()    ///////inittialisations avec les differents erreurs possible
    {
     try
     {
      FSRetVal tmp;
      string strFile;
      CInit m_Init;
     
      if(m_bver==0) ////testali mettre appel du this ? 
       strFile=string((LPCTSTR)(m_Init.Get_Params_Hardware_Config_FileInit()+"BestCamHardware_"+m_Init.Get_Params_Hardware_Config_FileInit_NumA()+".ini")); 
      else
       strFile=string((LPCTSTR)(m_Init.Get_Params_Hardware_Config_FileInit()+"BestCamHardware_"+m_Init.Get_Params_Hardware_Config_FileInit_NumB()+".ini")); 
       tmp = m_pHardware->SetConfigFilePath((char*)strFile.c_str());  
     
       if(tmp!= FS_SUCCESS)
       { 
        if(m_bver==0)
        {
         TRACE("SetConfigFilePath Hardware 1 failed\n");
         return 1;
        }
        else 
        {
         TRACE("SetConfigFilePath Hardware 2 failed\n");
         return 2;
        }
       }
     
       TRACE("Init cam :%d  - config :%s\n",m_bver,(char*)strFile.c_str());
       tmp = m_pHardware->Initialize();
       if(tmp!= FS_SUCCESS)
       { 
        m_pHardware->FreeMem();
        if(m_bver==0)
        {
        TRACE("Initialize Hardware 1 NOK\n");
        TRACE("Explication Hardware 1 %s\n",FSRetVal_Names[tmp]);
        return 3;
        }
        else 
        {
        TRACE("Initialize Hardware 2 NOK\n");
        TRACE("Explication Hardware 2 %s\n",FSRetVal_Names[tmp]);
        return 4; 
        }
       }
       char* p_cdllver;
       p_cdllver=m_pHardware->GetDLLVersion();
      m_Init.Set_Params_Hardware_Config_Dllversion(p_cdllver);
       TRACE("Init Hardware OK pour cam : %d\n",m_bver); 
      return 0;
     }
     catch(...)
     {
      TRACE("Init NOK\n");
      return 5;
     }
    }

    -----------------------------------------------
    -----------------------------------------------
    AFFICHAGES DES PROBLEMES D'INIT HARDWARE
    -----------------------------------------------
    -----------------------------------------------


    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
     
    void CViewSYSInitialisation::OnTimer(UINT nIDEvent) 
    {
     // TODO: Add your message handler code here and/or call default
     unsigned int uiSecurity;
          CString strDatalist;            // pour afficher dans la list box                      
     uiSecurity=m_Init.Get_Params_SYS_Config_Securiy();
     // Vérifie le mode de fonctionnement
     if(nIDEvent==ID_CLOCK_SYS)
     {
      KillTimer(ID_CLOCK_SYS);
      CMy99090Doc *pDoc= (CMy99090Doc *) GetDocument();   
      UpdateData(true);
      if(uiSecurity& LEVEL_1)
      {
       if(pDoc->isProblemeAcquisition())
        m_bPblAcquisition=true;
       else
        m_bPblAcquisition=false;
       if(pDoc->isInitAcquisition())
        m_bAcquisition=true;
       else
        m_bAcquisition=false;
       if(pDoc->isProblemeTraitement())
        m_bPblTraitement=true;
       else
        m_bPblTraitement=false;
       if(pDoc->isInitTraitement())
        m_bTraitement =true;
       else
        m_bTraitement=false;
       if(pDoc->isProblemeWago())
        m_bPblWago=true;
       else
        m_bPblWago=false;
       if(pDoc->isInitWago())
        m_bWago=true;
       else
        m_bWago=false;
      }
      else
      {
       m_bPblAcquisition=false;
       m_bAcquisition=true;
       m_bPblTraitement=false;
       m_bTraitement =true;
       m_bPblWago=false;
       m_bWago=true;
      }
      if(pDoc->isProblemeTache())
       m_bPblTache=true;
      else
       m_bPblTache=false;
      if(pDoc->isInitTache())
       m_bTache=true;
      else
       m_bTache=false;
      if(m_Init.Get_Params_General_ModeProcess ()==PROCESS_SYS_AUTOMATIQUE)
      {
         if(uiSecurity& LEVEL_1)
       {
        int initHardwarestatus=pDoc->isProblemeHardware();
         if(initHardwarestatus)     
          m_ListeHardware.ResetContent ();   
         else
          m_bPblHardware=false;
                      switch(initHardwarestatus)
          {
                      case 1:  
                              m_bPblHardware=true;
            strDatalist.Format ("SetConfigFilePath Hardware 1 failed \n");
            m_ListeHardware.AddString (strDatalist);    
            break;
        case 2:  
                              m_bPblHardware=true;
            strDatalist.Format ("SetConfigFilePath Hardware 2 failed %d");
            m_ListeHardware.AddString (strDatalist);
            break;
                      case 3:  
                              m_bPblHardware=true;
            strDatalist.Format ("Initialize Hardware 1 NOK");
            m_ListeHardware.AddString (strDatalist);
           strDatalist.Format ("Explication Hardware 1  %d", FSRetVal_Names[tmp]);
            m_ListeHardware.AddString (strDatalist);
            break;
        case 4:  
                              m_bPblHardware=true;
            strDatalist.Format ("Initialize Hardware 2 NOK");
            m_ListeHardware.AddString (strDatalist);
            strDatalist.Format ("Explication Hardware 2  %d", FSRetVal_Names[tmp]);
            m_ListeHardware.AddString (strDatalist);
            break;  
                      }// switch()
     
     
         if(pDoc->isIniteHardware())
         m_bHardware=true;
            else
         m_bHardware=false;
       }
       else
       {
        m_bPblHardware=false;
        m_bHardware=true;
       }
       if(pDoc->isProblemeModbus())
        m_bPblModbus=true;
       else
        m_bPblModbus=false;
     
       if(pDoc->isInitModbus())
        m_bModbus=true;
       else
        m_bModbus=false;
      }
     
      UpdateData(false);
      SetTimer(ID_CLOCK_SYS,500,NULL);
     }
     else if(nIDEvent==ID_CLOCK_PULSE)
     {
      KillTimer(ID_CLOCK_PULSE);
      UpdateData(true);
      if( m_bModbus
       && m_bAcquisition
       && m_bModbus
       && m_bTache
       && m_bHardware
       && m_bWago
       && m_bTraitement
        )
      { 
       CMy99090Doc *pDoc= (CMy99090Doc *) GetDocument();   
       pDoc->OpenSYSVisualisation();
      }
      else    
      { 
       m_ctrlProgression.SetPos(m_iProgress);
     
       m_iProgress+=1;
     
       if(m_iProgress==100)
        m_iProgress=0;
       SetTimer(ID_CLOCK_PULSE,100,NULL);
      }
     }
     CFormView::OnTimer(nIDEvent);
    }


    Enfin le code ou je dois faire mes modifications pour retourner pour chaques instances les erreurs d'initialisations.

    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
     
     
    int CMy99090Doc::isProblemeHardware()             /////a savoir kel camera deconne
    {
     
    /*                                                         code depart
     int ireturn=0;
     m_pThreadHardware2->m_initHardwarestatus;
     if(m_pThreadHardware1==0 && m_pThreadHardware2==0 )  
      return 0;
        if(m_pThreadHardware1==0 || m_pThreadHardware2==0 )
         if (m_pThreadHardware1==0)
      {if (m_pThreadHardware2->isProbleme())
        ireturn =m_pThreadHardware2->m_initHardwarestatus;
      }
      else  
       if (m_pThreadHardware1->isProbleme())
        ireturn =m_pThreadHardware1->m_initHardwarestatus;
     return ireturn;
       */
                                                                                         // m_initHardwarestatus pour avoir le numero de l'erreur, deja defini grace a int CHardware::Init()
         int ireturn=0;
     if(m_pThreadHardware1->m_initHardwarestatus==0 && m_pThreadHardware2->m_initHardwarestatus==0)  
      return 0;
        if (m_pThreadHardware1->m_initHardwarestatus!=0 || m_pThreadHardware2->m_initHardwarestatus!=0)
     
      //if (m_pThreadHardware1->m_initHardwarestatus!=0)
            //if(m_bfront==0)
      //if(CHardware::m_pHardware->m_bver==0)    // ici j'ai des erreurs m_bver non connu alors que je met la classe devant ?
        if (m_pThreadHardware1->isProbleme())
         ireturn= m_pThreadHardware1->m_initHardwarestatus ;
        if (m_pThreadHardware2->isProbleme())
         ireturn= m_pThreadHardware2->m_initHardwarestatus ;
        // if(m_bfront==0)
        //   m_pThreadHardware1->m_initHardwarestatus;
        //  else 
        //    m_pThreadHardware2->m_initHardwarestatus;
     
        return ireturn;
     
    }
    Comme vous pouvez le voir je ne peu initialiser en même temps les deux Hardware ensemble car la fonction isProblemeHardware()
    ne renvoit qu'un seul entier.

    Pourrais-je eventuellement passer un argument à la fonction et si oui quel type d'argument et comment ?
    pourrais-je utiliser un this et comment?

    Merci de m'aider

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    je ne suis pas sûr d'avoir bien compris la question, mais si ton problème est le passage de données d'une fonction à une autre, il y a deux façons:

    1/ passage des paramètres par adresse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int unefonction(int &a, int &b)
    {
       a=10;
       b=20;
       return 0;
    }
     
    void uneautrefonction()
    {
       int a;
       int b;
       int c = uneautrefonction(a, b); // retourne 0 et met a à 10 et b à 20
    }
    2/ utilisation d'une classe 'conteneur' (que l'on passera également par adresse, afin d'éviter, entre autres, les problèmes de gestion de mémoire):
    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
    class A //ou une struct
    {
    public:
       int a;
       int b;
    };
     
    int unefonction(A& res)
    {
       res.a = 10;
       res.b = 20;
    }
     
    void uneautrefonction()
    {
       A unobjet;
       int toto = unefonction(unobjet);
    }
    Hope it helps.

  3. #3
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut
    Bonsoir,

    Merci il s'agisait aussi de m'informer la dessus merci par contre sauf erreur
    de ma part, j'ai l'impression qu'il y a une petite erreur dans ce que vous avez ecrit.
    Il me semble que dans cette formulation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    void uneautrefonction()
    {
       int a;
       int b;
       int c = uneautrefonction(a, b); // retourne 0 et met a à 10 et b à 20
    }
    uneautrefonction(a, b) serait plutot unefonction(a, b) sinon on serait dans une fonction recursive?

    Au niveau de mon probleme c'est vrai que j'ai trop charger de codes, ce n'est pas facile a comprendre, c'est pourquoi
    je pose une nouvelle question mais qui de plus sera differente du coup car j'ai apporter quelques modifications
    et j'ai un resultat convaincant au niveau de l'affichage. Donc maintenant ma question ce n'est plus comment afficher
    les resultats des 2 cameras mais comment passer un parametre d'un type donne a la fonction 'Init()' car il me faut
    afficher tous les erreurs d'initialisations possibles ( envoye par la dll du Hardware) et ces erreurs sont recuperer
    par une variable d'un type donne que je dois convertir en entier avant de la retourner a ma fonction Init(). Comme il s'agit d'une autre question je vais la poser en nouvelle discussion afin d'eviter de tout melanger et devenir clair.


    Je m'explique dans une nouvel topic.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/05/2015, 20h21
  2. Affichage sur une text box en fonction combobox
    Par lucieaup dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/09/2013, 15h46
  3. Réponses: 6
    Dernier message: 28/04/2011, 14h19
  4. affichage de liste avec deux colonne
    Par Invité dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 24/03/2009, 18h50
  5. Affichage sur écran avec deux carte ATI
    Par dleclere dans le forum Matériel
    Réponses: 0
    Dernier message: 02/02/2009, 19h11

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