Comportement anormal d'un event dans des threads
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
Code:
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:
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:
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