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