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:
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:
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:
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:
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