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.
Comme vous pouvez le voir je ne peu initialiser en même temps les deux Hardware ensemble car la fonction isProblemeHardware()
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; }
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
Partager