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

  1. #1
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 84
    Points : 90
    Points
    90
    Par défaut Plusieurs Thread exécutant des requêtes qui se terminent tous au même moment (quand le plus lent a terminé)
    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

  2. #2
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Salut, je peux te donner une autre piste pour ton cas d'utilisation qui peut te faire éviter les threads

    Exécuter tes requêtes avec les fonctions asynchrones

    https://doc.pcsoft.fr/fr-FR/?1000026094

  3. #3
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 84
    Points : 90
    Points
    90
    Par défaut
    Oui en fait j'ai déjà testé cette possibilité :

    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
     
    SAI_LOG = ""
    cal1()
    cal2()
     
    	PROCÉDURE INTERNE cal1()
    		qQuery1 est une Requête SQL = 
    		[
    			SELECT SUM(MATABLE1.Montant) 
    			FROM MATABLE1
    			WHERE MATABLE1.Date > '01/05/2022'
    		]
     
    		SI HExécuteRequêteAsynchrone(qQuery1, Cnx, hRequêteDéfaut, _setMontant) ALORS
    		SINON
    			pDB.CatchError("Erreur Exécution Requête",HErreurInfo(hErrComplet))
    		FIN
    		HLibèreRequête(qQuery1)
    	FIN
     
    	PROCÉDURE INTERNE cal2()
    		qQuery2		est une Requête SQL	= 
    		[
    			SELECT SUM(MATABLE2.Montant) 
    			FROM MATABLE2
    			WHERE MATABLE2.Date > '01/05/2022'
    		]
     
    		SI HExécuteRequêteAsynchrone(qQuery2, Cnx, hRequêteDéfaut, _setMontant) ALORS
    		SINON
    			pDB.CatchError("Erreur Exécution Requête",HErreurInfo(hErrComplet))
    		FIN
    		HLibèreRequête(qQuery2)
    	FIN
     
    	PROCÉDURE INTERNE _setMontant(monenr est un Enregistrement)
    		SAI_LOG += RC + monenr.Montant
    	FIN
    Et en fait c'est la même chose. L'affichage est mis à jour lorsque la plus lente des deux requêtes a terminé.

  4. #4
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    		SI HExécuteRequêteAsynchrone(qQuery1, CnxLOGeCOM, hRequêteDéfaut, _setMontant) ALORS
    		SINON
    			pDB.CatchError("Erreur Exécution Requête",HErreurInfo(hErrComplet))
    		FIN
    Je n'ai pas trop de piste mais on peut essayer quelque chose
    Et si tu utilisais 2 méthodes _setMontant1 et _setMontant2 propre à chaque HExecuteRequêteSQLAsynchrone plutôt qu'une ?

  5. #5
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 84
    Points : 90
    Points
    90
    Par défaut
    Et si tu utilisais 2 méthodes _setMontant1 et _setMontant2 propre à chaque HExecuteRequêteSQLAsynchrone plutôt qu'une ?
    Non pas mieux

  6. #6
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par jlbrd Voir le message
    Non pas mieux
    Je sèche alors je n'ai aucune piste pour toi désolé

  7. #7
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Si ton code est exécuté dans le traitement d'initialisation de la fenêtre, essaye de l'exécuter en fin d'initialisation de la fenêtre ?

  8. #8
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 267
    Points
    5 267
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Des pistes en vrac..

    -Qu'est-ce que ça donne si tu inverses l'appel des thread ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ThreadExécute("t2", threadNormal, cal2)
    ThreadExécute("t1", threadNormal, cal1)
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ThreadExécute("t1", threadNormal, cal1)
    ThreadExécute("t2", threadNormal, cal2)
    -As-tu tenté de forcer l'arrêt via threadFin avant l'appel de ton thread principal ?
    -As-tu tenté l'envoie d'un signal à ton thread principal (à la place du ThreadExécute ?)

    Personnellement la dernière solution "me parle"
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  9. #9
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 84
    Points : 90
    Points
    90
    Par défaut
    Bonjour, alors dans chacune des deux procédures j'ai commenté ExécuteThreadPrincipal et mis une trace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		Trace(DateHeureSys(), moMontant1)
    		ThreadFin()
    		//ExécuteThreadPrincipal(maj, dhDebut1, DateHeureSys(), moMontant1)
    L'appel du thread principal n'est plus appelé pourtant ça ne fonctionne pas mieux. Pareil en inversant les appels t1 et t2. La DateHeure affichée a exactement la même valeur dans les deux lignes de trace.

  10. #10
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par jlbrd Voir le message
    Bonjour, alors dans chacune des deux procédures j'ai commenté ExécuteThreadPrincipal et mis une trace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		Trace(DateHeureSys(), moMontant1)
    		ThreadFin()
    		//ExécuteThreadPrincipal(maj, dhDebut1, DateHeureSys(), moMontant1)
    L'appel du thread principal n'est plus appelé pourtant ça ne fonctionne pas mieux. Pareil en inversant les appels t1 et t2. La DateHeure affichée a exactement la même valeur dans les deux lignes de trace.
    Tu as essayé d’exécuter ton code en fin d'initialisation de la fenêtre ?

  11. #11
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 84
    Points : 90
    Points
    90
    Par défaut
    Je suis dans le code d'un bouton

  12. #12
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    D'après ce que tu as dis, cal1 est rapide. Dans ce cas, pourquoi ne pas faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sablier(vrai)
    ThreadExécute("t2", threadNormal, cal2)
    cal1()
    Multitacherepeint(mafenêtre)
    multitâche(-1)
    sablier(faux)
    Tu lances le traitement long en "arrière plan". Pendant ce temps, le traitement rapide s'affiche (ou presque).

    A tester, bien sûr...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  13. #13
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 84
    Points : 90
    Points
    90
    Par défaut
    Oui ta proposition devrait fonctionnement. Mais dans l'exemple j'ai 2 requêtes, en réalité c'est environ une dizaine qui va être lancée sans qu'on puisse prévoir leur temps d'exécution

  14. #14
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Peut-être en essayant un autre paramètre que ThreadNormal, je pense à threadUtiliseHFSQL ?

    Peut-être en essayant avec une "vrai" procédure plutôt qu'une procédure interne ? J'aime beaucoup les procédures internes mais peut-être qu'il y a un mode de fonctionnement qui fait cela provoque ce blocage.

    Peut-être en faisant un code beaucoup moins propre et compréhensible et au lieu d'avoir des threads, avoir des OuvreSoeur (ou OuvreFille) de fenêtres cachées qui exécute chacun des thread ?

  15. #15
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    +1 @Narwe (tiens un revenant )

    Une autre idée (pour tester), c'est de lancer des procédures (locales ou globales) via des timers (timersys) ou ceux gérés directement par Windev (dans l'éditeur de code)
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  16. #16
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Au point ou on en est je balance des idées comme ça

    Essaye de ne pas lancer un HLibèreRequête à la fin ?
    Essaye de passer par des requêtes créée dans le projet ?

  17. #17
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 267
    Points
    5 267
    Billets dans le blog
    1
    Par défaut
    A priori, tu as zappé la solution du signal.

    On va utiliser 2 signaux, siSynchro qui va s'assurer que le thread principal est bien prêt à traiter le résultat des thread secondaire, et siFinThread qui va être envoyé par un thread secondaire lorsque son traitement sera terminé et avertira le thread principal qu'il peut traiter le résultat.
    Par ailleurs afin d'éviter une perte de résultat consécutive à des fins de traitement simultanée, on enfilera les threads secondaires (l'ordre dans lequel il auront été terminé sera alors conservé)

    Le code est le suivant :
    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
     
    PROCÉDURE TrPrincipal()
    nCompteurThread	est entier
    saNomProc		est chaîne
    saMsg est chaîne
     
    siSynchro est un SignalManuel
    siFinThread est un SignalManuel
    liThreadsTerminés est File de chaîne
     
    ThreadExécute("tCourt",threadNormal,ProcLongue,liThreadsTerminés,siSynchro,siFinThread)
    ThreadExécute("tLong",threadNormal,ProcCourte,liThreadsTerminés,siSynchro,siFinThread)
    SignalOuvre(siSynchro) //On lance les threads simultanément
     
    nCompteurThread=1
    TANTQUE nCompteurThread<=2
    	SignalAttend(siFinThread)
    	SignalFerme(siFinThread)//On arrête d'enfiler les résultat de fin
            //On traite les résultats des threads
    	TANTQUE liThreadsTerminés..Occurrence>0
    		Défile(liThreadsTerminés,saNomProc)
    		saMsg=ChaîneConstruit("Thread n° %1, (%2) est terminé",nCompteurThread,saNomProc)
    		ToastAffiche(saMsg)
    		Trace(saMsg)
    		nCompteurThread++
    	FIN
    FIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCÉDURE ProcCourte(liThreads est File de chaînes, siDépart est un SignalManuel,siFin est un SignalManuel)
    SignalAttend(siDépart)	//Attend que tous les threads soient prêts
    ThreadPause(100)	//Corps du thread
    Enfile(liThreads,"ProcCourte")
    SignalOuvre(siFin)	//On prévient de la fin du thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCÉDURE ProcLongue(liThreads est File de chaînes, siDépart est un SignalManuel,siFin est un SignalManuel)
    SignalAttend(siDépart)
    ThreadPause(200)
    Enfile(liThreads,"ProcLongue")
    SignalOuvre(siFin)
    On voit que si l'on change la valeur de la pause de 100 à 300 dans ProcCourte, ProcCourte est traitée après ProcLongue
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  18. #18
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 84
    Points : 90
    Points
    90
    Par défaut
    Bonjour @Voroltinquo,

    Ta solution fonctionne tant que tu mets des temporisation dans tes deux threads. Le problème est toujours le même car lorsque l'on exécute des requêtes SQL dans tes threads, toutes les requêtes renvoient leur résultat lorsque le requête la plus lente est terminée et pas avant. Du coup les deux threads eux aussi se terminent en même temps.

    Donc la question ce n'est pas la façon d'utiliser les threads mais pourquoi ces requêtes sont bloquées tant qu'une est encore en train de s'exécuter ? Il doit y avoir une limitation du framework et/ou du driver utilisé (SQLOLEDB) mais rien n'est documenté à ce sujet.

    Merci et bonne journée

  19. #19
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 056
    Points : 9 394
    Points
    9 394
    Par défaut
    Ca va être difficile à tester, mais si tu exécutes ces différentes requêtes via des programmes totalement différents, est-ce que tu as le même phénomène ?
    L'idée, c'est quoi : c'est que si 2 requêtes attaquent la même table, il peut arriver qu'elles entrent en conflit. La première requête bloque la table, et la 2ème ne commencera que quand la première sera finie. Et si la 2ème est extrêmement courte, tu as l'impression qu'elles finissent en même temps.
    C'est assez logique que ça se passe comme ça si certaines requêtes écrivent dans les tables. Ce serait plus surprenant si tes requêtes font toutes de la consultation.

    Ici, tu as une application 'professionnelle'. Et tu utilises HFSQL. Peut-être que passer sur du MySQL ou autre pourrait résoudre tes problèmes.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  20. #20
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 267
    Points
    5 267
    Billets dans le blog
    1
    Par défaut
    Pour revenir sur l'idée de tbc92, même si tes requêtes ne font que de la consultation, il est possible que quelqu'un écrive sur la table pendant ta requête.
    Un idée serait de travailler avec des vues initialisées avant l'appel des threads.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

Discussions similaires

  1. Bouton checkbox qui exécute des requêtes
    Par vatmx dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/02/2014, 13h13
  2. Bouton checkbox qui exécute des requêtes
    Par vatmx dans le forum Langage
    Réponses: 2
    Dernier message: 02/02/2014, 12h30
  3. [requête]Exécution des requêtes
    Par bacchus30 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 21/05/2007, 12h03
  4. Réponses: 2
    Dernier message: 24/04/2007, 00h18
  5. Des requêtes qui s'effacent toutes seules
    Par Celia1303 dans le forum Access
    Réponses: 2
    Dernier message: 16/12/2005, 15h19

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