Bonjour à tous

Je réalise un programme chargé d'afficher un certains nombre de cibles à l'écran. le déclanchement de cet affichage intervient lors de la reception d'un front montant sur la broche D0 du port parallèle, d'où l'utilisation du composant. Ceci permet notamment de syncroniser cet affichage avec un autre appareil qui nous sert à faire des mesures.

Jusqu'à présent, je n'avais aucun problème mais depuis que je suis passé en affichage OpenGL, je n'ai plus d'affichage pendant la boucle d'attente sur le port parallèle.

j'ai en faite une boucle qui scrute le port parallèle jusqu'à ce que l'on reçoive un front montant sur la broche D0 et c'est là que viens le problème puisque si je la met en commentaire, mon affichage de la croix se fait correctement.

Voici mon code :

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
150
151
 
// Union pour la récupération des broches du port parallèle
union TSChar
{
        char chr;
        struct
        {
                unsigned char Bit0 : 1;
                unsigned char Bit1 : 1;
                unsigned char Bit2 : 1;
                unsigned char Bit3 : 1;
                unsigned char Bit4 : 1;
                unsigned char Bit5 : 1;
                unsigned char Bit6 : 1;
                unsigned char Bit7 : 1;
        };
};
 
// Méthode chargée de dessiner l'écran
void __fastcall TSessionForm::OnPaint(TObject *Sender)
{
    // Si OpenGL est actif
    if(OpenGlActif)
    {
        // Si l'on est en mode Attente du port ou Mesure A Vide
        if(AttentePort || AVide)
        {
            // On défini la couleur de dessin
            DefinirCouleurDessin(CouleurCible);
 
            // On dessine la croix
            Croix();
        } 
}
 
// Méthode qui permet de lancer une session
void __fastcall TSessionForm::LancerSession(void)
{
        // booléen pour savoir si l'on peut lancer la partie
        bool Lancement = false;
 
        // Si le memo est affiché
        if(Memo->Visible == true)
        {
                // On le rend invisible
                Memo->Visible = false;
 
                // On désactive le menu de popup FermerProfil
                FermerProfil->Enabled = false;
 
                // On le vide
                Memo->Clear();
 
                // On marque que l'on peut lancer la partie
                Lancement = true;
        }
        // Sinon
        else
        {
                // Si la sélection du fichier XMl de profil à réussit
                if(SelectionnerProfil())
                {
                        // Si le Fichier XML est correct
                        if(ChargerProfilXML())
                        {
                                // On marque que l'on peut lancer la partie
                                Lancement = true;
                        }
                }
        }
 
 
        // Si le booléen de lancement est à vrai
        if(Lancement)
        {
                // On prépare le profil
                PreparerProfil();
 
                // On cache le curseur de la souris
                Screen->Cursor = crNone;
 
                // On désactive le menu de click droit
                this->PopupMenu->AutoPopup = false;
 
                // On modifie le contexte d'aide de la fenêtre de session
                HelpContext = 8;        // HELPCONTEXT = 8 => IDH_LANCERSESSION
 
                if(Application->MessageBox("Utiliser la plateforme ?", "", MB_YESNO) == IDYES)
                {
                        // On se met en attente sur le port parallèle
                        AttenteDuPort();
                }
 
                // Si l'on a pas arrêter pendant l'attente du port
                if(!ArretPendantAttentePort)
                {
                        // On marque que l'on démarre le premier groupe de cibles
                        NumGroupeCibles = 0;
 
                        // On lance la cible
                        DbtGroupeCibles();
                }
        }
}
 
 
// Méthode qui met en attente le programme
void __fastcall TSessionForm::AttenteDuPort(void)
{
        TSChar donnee;          // Structure permettant de récupérer les valeurs
                                // des broches du port parallèle
 
        // Ouverture du port
        OuvrirPort();
 
        //ShowMessage("Le port est ouvert");
 
        // Mettre le port en lecture
        // Bit 5 du registre de base + 2 a 1
        PortIO->Port [0x37A] = PortIO->Port [0x37A] | 0x20;
 
        // On met le booléen d'attente de port à vrai
        AttentePort = true;
 
        // Si OpenGl n'est pas actif
        if(!OpenGlActif)
        {
                // On initialise OpenGL
                InitOpenGl();
        }
 
        Application->ProcessMessages();
 
        while(AttentePort)
        {
                Application->ProcessMessages();
 
                // On lit le port parallèle
                donnee.chr = PortIO->Port [0x378];
 
                // Si le bit passe à 1
                if(donnee.Bit0 == 1)
                {
                        // On arrète l'attente
                        AttentePort = false;
 
                        // On ferme le port
                        FermerPort();
                }
        }
}
Merci d'avance pour votre aide