Bonjour à tous
J'ai développé ,sous visual studio 2013, un programme d'acquisition de mesure de caméra daté. Le système est le suivant je pilote une caméra qui enregistre des images et à chaque fois que la caméra acquière une image elle envoie un signal électrique sur une carte GPS qui date avec précision le moment ou le signal a été reçu. Le déclenchement de l'acquisition peut se faire de 2 façons soit via une interface à l'écran avec l'appui sur un bouton, soit via une connexion réseau. Quand je lance l'acquisition d'image via l'interface tout ce passe bien. Par contre quand je la lance via le réseau l'acquisition des images fonctionne mais pas l'acquisition des temps.
Mon programme est constitué de plusieurs thread
- Tread d'acquisition des images qui enregistre les images dès que le top de déclenchement est donné
- Thread d'acquisition des temps qui enregistre les temps enregistré par la carte de datation dès que le top de déclenchement est donné
- Thread de communication réseau qui lit les messages provenant du serveur et déclenche l'acquisition
Qu'il soit fait via le réseau ou via l'interface, le déclenchement de l'acquisition passe par la fonction ci dessous
Après de multiples essais il apparait que l'instruction SetEvent(g_hEventSynchro); n'est pas exécutée quand la fonction Trigge() est appelée via le thread réseau. En conséquence le thread d'acquisition des temps n'enregistre pas les temps.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void CAppAcqCamDlg::Trigge() { SetEvent(g_hEventSynchro); // indique au thread d'acquisition des temps qu'une mesure a commencé ConfigureCamera(); // fonction qui configure la caméra de telle sorte qu'elle envoie un signal électrique à chaque image acquise SetEvent(g_hEventAcq); // indique au thread d'acquisition des image qu''une mesure a commencé }
Ce que je ne comprend pas c'est pourquoi l'instruction SetEvent(g_hEventSynchro); s’exécute dans un cas et pas dans l'autre
Le thread de communication réseau
Le thread d'acquisition des temps
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 void CAppAcqCamDlg::Ecoute() { char buffer[32]; m_ctlStatusError.SetWindowText("Attente top acquisition"); while (g_PgmON) { memset(buffer, 0, 32); if (recv(m_csock, buffer, sizeof(buffer), 0) != 0) { m_ListeMsgCam.AddString(buffer); if (strstr(buffer, "TRIGGER") != NULL) { Trigge(); m_ctlStatusError.SetWindowText("Acquisition en cours"); } } } }
Si quelqu'un a une idée je suis preneur
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 int CAppAcqCamDlg::acqSynchro() { TMSTMP_SRC src = (TMSTMP_SRC)1; unsigned int cnt, index,nwait; TSYNC_HWTimeObj tsData; CString msg; nwait = 0; while (g_PgmON) { DWORD rc = WaitForSingleObject(g_hEventSynchro, 500); if (rc == WAIT_OBJECT_0) { //Lancement de l'acquisition des temps g_SyncStarted = TRUE; err = TSYNC_HW_getTsCount(hndTSYNC, src, &cnt); err = TSYNC_HW_setTsClear(hndTSYNC, src); if (err == TSYNC_SUCCESS) { index = 0; for (int m = 0; m < nbmaxevent; m++) { evhh[m] = 0; evmm[m] = 0; evss[m] = 0; evns[m] = 0; } while (!g_FinAcq && index < nbmaxevent) { Sleep(100); err=TSYNC_HW_getTsCount(hndTSYNC, src, &cnt); if (err==TSYNC_SUCCESS && cnt > 0){ msg.Format("Cnt=%u index=%u",cnt,index); for (int m = 0; m < cnt; m++) { TSYNC_HW_getTsSingle(hndTSYNC, src, &tsData); evhh[index] = tsData.time.hours; evmm[index] = tsData.time.minutes; evss[index] = tsData.time.seconds; evns[index] = tsData.time.ns; index++; } } else msg.Format("no event"); m_ctlEventSync.SetWindowText(msg); } } } } return 0; }
Partager