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

  1. Tread d'acquisition des images qui enregistre les images dès que le top de déclenchement est donné
  2. 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é
  3. 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

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é		
}
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.

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

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");
			}
 
		}
	}
}
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
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;
}
Si quelqu'un a une idée je suis preneur