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