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

WinDev Discussion :

Plusieurs thread pour même requête [WD19]


Sujet :

WinDev

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 472
    Points
    472
    Par défaut Plusieurs thread pour même requête
    Bonjour,

    J'ai plusieurs threads qui doivent exécuter une requête paramétré avec des paramètres différents pour chaque thread.
    Seulement j'ai l'impression que le résultat de la requête est partagé entre tous les threads, ce qui pose des problèmes d'accès à ma requête et qui fausse les données.
    Avec des sections critiques je n'ai plus de problème, mais j'augmente énormément le temps de traitement, car je fais de long traitement sur le résultat de la requête.
    Y-il a t'il un moyen de dupliquer une requête sous Windev 19 pour que chaque thread ait sont propre contexte ?

    J'ai essayé avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sdD est une Source De Données = REQ_MaRequête
    mais ça ne fonctionne pas.

    Merci d'avance

    Cordialement

  2. #2
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Bonjour,

    Avez-vous essayé l'option threadUtiliseHyperFile ?
    Sinon, vous pouvez renommer la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sdReq est source de données = "sdReq" + DonneIdentifiant()

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 472
    Points
    472
    Par défaut
    Bonjour,

    L'option threadUtiliseHyperFile ne donne rien malheureusement.
    J'ai l'impression qu'elle fait bien une copie du contexte HFSQL au lancement du thread, mais ensuite les appels se font toujours sur la même instance de requête.

    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sdD est une Source de Données = "sdD" + DonneIdentifiant()
    		sdD = REQ_Planning
    Cela me donne une erreur a l'exécution : 'Un element de type vide ne peut pas être convertis en type Source de Données'

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sdD est une Source de Données = "REQ_Planning" + DonneIdentifiant()
    		bReservation est un boolean = HExécuteRequête(sdD,hRequêteDéfaut, gtaRessource[sImma].ID, d, df) _ET_ HLitPremier(sdD)
    ET j'ai l'erreur suivante : L'élément 'REQ_Planning1' n'a pas été trouvé.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 472
    Points
    472
    Par défaut
    Autre info, la case "contexte indépendant" dans l'éditeur de fenêtre ne résout pas mon problème :/

  5. #5
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    J'avais testé rapidement dans WD18 avec une requête éditeur, et les 2 threads n'interféraient pas.
    Donc je ne comprends pas d'où peut venir votre problème.

    Pouvez-vous faire un projet minimal de repro en WD18 ?

    Avec une requête SQL et une variable source de données, je suis certain que les requêtes ne sont pas partagées entre les threads, c'est d'ailleurs un problème pour moi (il est difficile/lent d'exécuter une requête dans un thread puis d'en récupérer le résultat dans l'IHM).

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 472
    Points
    472
    Par défaut
    Bonjour,

    Je suis uniquement sous WD19 :/

    Je viens de tenter de reproduire le problème sur un autre projet, mais les threads n'interfèrent pas !
    Je n'y comprend rien, peut-être ai-je une erreur dans mon code ?

    J'ai réussis a isolé une partie de celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dc est une DateHeure
    POUR i = 1 A 2
    	dc = DateHeureT0+(i*DureeUneJournee)
    	ThreadExécute("ChargerCache"+dc,threadUtiliseHFSQL,ChargerCache,dc)
    	dc = d+(-i*gduIntervalTotal)
    	ThreadExécute("ChargerCache"+dc,threadUtiliseHFSQL,ChargerCache,dc)
    FIN
    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
     
    PROCEDURE ChargerCache(dhDateDebut est une DateHeure)
     
    dhDateFin est une DateHeure = dhDateDebut + dureeUneJournee
     
    //Parcours en hauteur du planning
    POUR TOUT e DE PLN_Edt..Ressource..TableauRessourcePlanning
     
    	/* Traitement divers ... */
     
    	//#################### Obtient l'ID du titulaire ############################
    	SectionCritiqueDébut("REQ_selectUtilisateur")
    	HExécuteRequête(REQ_selectUtilisateur,hRequêteDéfaut, gtaRessource[sImma].sTitulaire)
    	SI HLitPremier(REQ_selectUtilisateur) ALORS
    		nIDTitulaire = REQ_selectUtilisateur.ID_Individu
    	FIN
    	HLibèreRequête(REQ_selectUtilisateur)
    	SectionCritiqueFin("REQ_selectUtilisateur")
    	//############################################################################
     
     
     
    	/* Traitement divers ... */
     
     
    	//Parcours en largeur du planning
    	TANTQUE ...
     
    		/* Traitement divers ... */
     
    		//#################### Check s'il y a un rendez-vous dans la BDD ############################
    		SectionCritiqueDébut("REQ_Planning")
    		bReservation est un boolean = HExécuteRequête(REQ_Planning,hRequêteDéfaut, gtaRessource[sImma].ID, d, df) _ET_ HLitPremier(REQ_Planning)
    		SI bReservation ALORS
    			rdv.Titre = REQ_Planning.ID_Individu
    			rdv.Contenu = REQ_Planning.Nom
    			rdv.DateDébut =REQ_Planning.dDebut
    			rdv.DateFin = REQ_Planning.dFin
    			rdv.ID = REQ_Planning.ID_Reservation
    		FIN
    		HLibère(REQ_Planning)
    		SectionCritiqueFin("REQ_Planning")
    		//############################################################################################
     
    		SI bReservation ALORS
     
    			/* Traitement divers ... */
     
    		SINON
     
    			//############################# Check s'il y a une non-reservation dans la base de données ##############################
    			SectionCritiqueDébut("REQ_SelectToutNonReservation")
    			REQ_SelectToutNonReservation.prm_Debut = d
    			REQ_SelectToutNonReservation.prm_IDVehicule = gtaRessource[sImma].ID
    			b est un boolean =  gtaRessource[sImma].sTitulaire = "pool"
    			nonReservation est un boolean = b _OU_ (HExécuteRequête(REQ_SelectToutNonReservation) _ET_ (HLitPremier(REQ_SelectToutNonReservation)))
    			SI PAS b ALORS HLibère(REQ_SelectToutNonReservation)	
    			SectionCritiqueFin("REQ_SelectToutNonReservation")
    			//#######################################################################################################################
     
     
     
    			SI PAS nonReservation ALORS
     
    					/* Traitement divers ... */
     
    			FIN
    		FIN
     
    		/* Traitement divers ... */
     
    	FIN
    FIN
    J'ai fais abstraction des éléments extérieur au problème du mieux que j'ai pu.
    Lorsque je débug, wstdt.exe crash a la fermeture et si je compile win 32bits, l'application crash au lancement sans aucun rapport d'erreur.
    Il m'arrive de manière aléatoire d'avoir des erreurs lors du debogage, du style la sdd n'a pas été initialisée et vous avez appelez Hlibère.
    Alors que la sdd est bel et bien initialisé.

  7. #7
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Déjà, une petite remarque : accéder à l'IHM depuis un thread secondaire peut être risqué.

    Ensuite, êtes-vous certain de votre diagnostic ?
    L'interférence pourrait avoir lieu dans l'accès aux champs et variables partagés, plutôt que dans le paramétrage ou le parcours de la requête.

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 472
    Points
    472
    Par défaut
    Merci pour votre remarque, j'ai modifié le programme pour que toutes les modifications de l'IHM se fassent dans le Thread Principal grâce à la fonction ExecuteThreadPrincipal.

    Pour les accès, je ne fais que de la lecture concernant les variables partagées.
    A chaque fois que j'ai un rapport d'erreur critique, ça concerne une requête.

    Par exemple, si je commente les sections critiques, le debug fonctionne. Par contre, lorsque je lance le programme généré, j'ai un rapport d'erreur qui me dit
    Erreur à la ligne 72 du traitement Procédure locale ChargerCache.
    Vous avez appelé la fonction HLibère.
    La source de données <REQ_Planning> n'est pas initialisée.
    ....
    Appel WL :
    Traitement de 'Procédure locale ChargerCache' (FEN_Planning.PROCEDURE.ChargerCache), ligne 72, thread 0
    Fonction 'HLibère', syntaxe 1
    ....
    Code erreur : 70018
    Niveau : erreur fatale (EL_FATAL)
    Code erreur WD55 : 18

  9. #9
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Je crois que vous confondez HLibère et HLibèreRequête, ou HAnnuleDéclaration.
    HLibère sert à supprimer les enregistrements "rayés" d'un fichier HF.

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 472
    Points
    472
    Par défaut
    Ah en effet, j'ai fais des erreurs d’inattention la dessus, merci
    Mais même avec HLibèreRequête ou sans, le problème persiste.
    J'ai par moment des sources de données qui ne sont pas initialisées.

  11. #11
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Une source pas initialisée, ça peut être dû à une erreur lors de l'exécution de la requête (qu'on a ignorée), ou bien un contexte partagé (suppression dans un thread, accès dans l'autre), ou encore une faute dans le code qui fait qu'on n'a pas exécuté la requête, ou qu'on l'a libérée trop tôt (dans une sous-fonction par exemple)...
    Je ne peux pas vraiment vous aider plus, vous devez avoir une erreur dans votre code, c'est le plus probable.

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 472
    Points
    472
    Par défaut
    D'accord merci pour toute l'aide en tout cas, ça m'a permit d'avancer

    Pour le problème, j'ai divisé le nombre de requête par 10, et maintenant ça tourne sans problème *_*
    J'ai pas tout compris, mais ça marche (mieux qu'avant), donc je vais me contenté de ce que j'ai.

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème récuperation plusieurs valeurs pour même champ
    Par Cocotonio20 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2013, 22h22
  2. [MySQL] Utiliser plusieurs fois la même requête
    Par zozoman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/08/2013, 11h43
  3. [AC-2003] Exécuter plusieurs fois une même requête ajout avec le même paramètre.
    Par paulojbt9 dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/07/2011, 11h34
  4. Réponses: 2
    Dernier message: 21/02/2008, 21h05
  5. [C#] Plusieurs Thread pour éviter le freeze du chargement
    Par mister3957 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 15/09/2006, 20h00

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