Bonjour,
Pour renseigner un tableau de bord, j’ai besoin d’exécuter plusieurs requêtes simultanément qui ne doivent pas bloquer l’interface et qui doivent afficher leur résultat dès que le requête est terminée. Pour cela j’utilise des thread. Mon problème est que lorsque plusieurs thread exécutant des requêtes sont lancés, ils se terminent tous lorsque le plus lent a terminé.
Exemple avec un bouton mettant à jour un champ de saisie :
La première requête est très rapide alors que la deuxième met plusieurs secondes pourtant les deux valeurs sont affichées en même temps ce qui signifie que les deux thread se termine quand le plus lent a terminé.
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 SAI_LOG = "" ThreadExécute("t1", threadNormal, cal1) ThreadExécute("t2", threadNormal, cal2) PROCÉDURE INTERNE cal1() dhDebut1 est un DateHeure = HeureSys() moMontant1 est un monétaire qQuery1 est une Requête SQL = [ SELECT SUM(MATABLE1.Montant) FROM MATABLE1 WHERE MATABLE1.Date > '01/05/2022' ] SI HExécuteRequête(qQuery1, Cnx, hRequêteSansCorrection) ALORS HLitPremier(qQuery1,hForwardOnly+hSansRafraîchir) SI PAS HEnDehors(qQuery1) moMontant1 = qQuery1.Montant FIN SINON Erreur("Erreur Exécution Requête",HErreurInfo(hErrComplet)) FIN HLibèreRequête(qQuery1) ExécuteThreadPrincipal(maj, dhDebut1, DateHeureSys(), moMontant1) FIN PROCÉDURE INTERNE cal2() dhDebut2 est un DateHeure = HeureSys() moMontant2 est un monétaire qQuery2 est une Requête SQL = [ SELECT SUM(MATABLE2.Montant) FROM MATABLE2 WHERE MATABLE2.Date > '01/05/2022' ] SI HExécuteRequête(qQuery2, Cnx, hRequêteSansCorrection) ALORS HLitPremier(qQuery2,hForwardOnly+hSansRafraîchir) SI PAS HEnDehors(qQuery2) moMontant2 = qQuery2.Montant FIN SINON Erreur("Erreur Exécution Requête",HErreurInfo(hErrComplet)) FIN HLibèreRequête(qQuery2) ExécuteThreadPrincipal(maj, dhDebut2, DateHeureSys(), moMontant2) FIN PROCÉDURE INTERNE maj(LOCAL P_heureDebut1 est un DateHeure, LOCAL P_heureDebut2 est un DateHeure, P_val est un monétaire ) SAI_LOG += RC + "Heure debut 1: " + P_heureDebut1+ " Heure debut 2: " + P_heureDebut2 + " Valeur : " + P_val + " Heure procédure " + DateHeureSys() FIN
Ci-dessous un même test mais sans requête. Cette fois ça fonctionne correctement :
Je pense donc que c’est lié à un problème de contexte HFSQL mais je ne sais pas comment régler le problème. J’ai testé aussi avec TâcheParallèleExécute et c’est le même problème.
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 SAI_LOG = "" ThreadExécute("t1", threadNormal, cal1) ThreadExécute("t2", threadNormal, cal2) PROCÉDURE INTERNE cal1() dhDebut1 est un DateHeure = HeureSys() moMontant1 est un monétaire = 100.10 ExécuteThreadPrincipal(maj, dhDebut1, DateHeureSys(), moMontant1) FIN PROCÉDURE INTERNE cal2() dhDebut2 est un DateHeure = HeureSys() moMontant2 est un monétaire = 300.33 Temporisation(200) ExécuteThreadPrincipal(maj, dhDebut2, DateHeureSys(), moMontant2) FIN PROCÉDURE INTERNE maj(LOCAL P_heureDebut1 est un DateHeure, LOCAL P_heureDebut2 est un DateHeure, P_val est un monétaire ) SAI_LOG += RC + "Heure debut 1: " + P_heureDebut1+ " Heure debut 2: " + P_heureDebut2 + " Valeur : " + P_val + " Heure procédure " + DateHeureSys() FIN
Quelqu’un a-t-il une idée ?
Merci et bonne journée
Partager