IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Comportement anormal d'un event dans des threads


Sujet :

Visual C++

  1. #1
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut 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

    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

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    La fonction SetEvent() positionnera toujours l'événement demandé. Si elle ne 'semble' pas le faire, le problème est certainement ailleurs.
    Commencer par vérifier la valeur de retour, si l'événement n'est pas encore créé à cet instant ou si les droits sont insuffisants, elle ne fonctionnera pas.
    Autre possibilité, l'événement est 'effacé' par un WaitFor__Objet() (dans le cas d'un événement non manuel) ou par un ResetEvent(), voire détruit par un CloseHandle().

  3. #3
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par dalfab Voir le message
    La fonction SetEvent() positionnera toujours l'événement demandé. Si elle ne 'semble' pas le faire, le problème est certainement ailleurs.
    Ce que je ne comprends pas c'est pourquoi ça fonctionne quand la fonction est éxécuté par le thread principal et que ça ne fonctionne pas quand elle l'est par le thread de communication réseau.

    Citation Envoyé par dalfab Voir le message
    Commencer par vérifier la valeur de retour, si l'événement n'est pas encore créé à cet instant ou si les droits sont insuffisants, elle ne fonctionnera pas.
    C'est ce que j'ai fait et le retour indique bien que ça a fonctionné. Mais le WaitFor dans mon thread d'acquisition du temps ne semble pas le recevoir.

    Citation Envoyé par dalfab Voir le message
    Autre possibilité, l'événement est 'effacé' par un WaitFor__Objet() (dans le cas d'un événement non manuel) ou par un ResetEvent(), voire détruit par un CloseHandle().
    Le seul WaitFor est celui qui est dans la fonction d'acquisition du temps

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Gouyon Voir le message
    Mais le WaitFor dans mon thread d'acquisition du temps ne semble pas le recevoir.
    Elle semble ne jamais recevoir l'event, ou elle semble en sauter quelques-un?
    Edit: Et aussi, à quels moments les events sont-ils resettés?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Elle semble ne jamais recevoir l'event, ou elle semble en sauter quelques-un?
    Non il n'en saute aucun car j'en envoie qu'un seul.
    Citation Envoyé par Médinoc Voir le message
    Edit: Et aussi, à quels moments les events sont-ils resettés?
    L'event se reset de lui même car je l'ai créé comme étant auto-reset

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Fais gaffe, les événements en auto-reset ont quelques inconvénients: An auto-reset event is just a stupid semaphore
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Expose event dans un thread
    Par minours dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 25/02/2010, 14h05
  2. Controler des textBox dans des thread
    Par ramaro dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/04/2008, 14h21
  3. [JDOM] SAXBuilder dans des threads
    Par Mostrapotski dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 26/01/2008, 12h07
  4. MySQL error : Lost connection dans des thread php
    Par max44410 dans le forum Requêtes
    Réponses: 0
    Dernier message: 17/01/2008, 08h38
  5. [C#][2.0] Sauvegarde d'un DataSet dans des threads différents
    Par Pilloutou dans le forum Framework .NET
    Réponses: 9
    Dernier message: 23/04/2007, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo