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

Ci-dessous un même test mais sans requête. Cette fois ça fonctionne correctement :
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
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.

Quelqu’un a-t-il une idée ?

Merci et bonne journée