Bonjour à tous!
Après plusieurs semaines de recherche, je pense baisser les bras avec les threads
Problème :
Je vais essayer résumer l'essentiel:
Avant, je tiens à souligner que je n'ai aucun problème sur l'utilisation des threads ni aucune erreur mais seulement des résultats incohérents dont je n'arrive pas à trouver la raison.
J'ai un gros fichier Hyperfile d'articles de l'ordre de plusieurs millions d'enregistrements.
Pour chacun des articles, je fais une requete HTTP afin de vérifier sur un site web l'existence de l'article.
Si elle n'existe pas sur le site je l'ajoute à une liste.
La rubrique Done de ARTICLE permet de savoir si la requete a été effectué pour un article donné!
gBStop est une variable booléene pour stopper l'exécution des threads.
Voici le code de ma procédure Check_New_Item()
et voici le code de lancement :
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 PROCEDURE Check_New_Item(nBre,idPosition) HTTPCookieGère(Faux) HLitRecherchePremier(ARTICLE,IDArticle,idPosition) TANTQUE PAS HEnDehors(ARTICLE) SI ARTICLE.Done="" ALORS ARTICLE.Done="ok" HModifie(ARTICLE) gnEnCours=ARTICLE.IDArticle Message("Checking de "+ARTICLE.LIBELLE) HTTPRequête(sUrl) Multitâche(20) sResult=HTTPDonneRésultat(httpRésultat) SI ChaîneOccurrence(sResult,ARTICLE.LIBELLE,SansCasse)=0 ALORS // Article existant - Ajout à ma liste HRAZ(NOUVEL_ARTICLE) NOUVEL_ARTICLE.IDArticle=ARTICLE.IDArticle NOUVEL_ARTICLE.LIBELLE=ARTICLE.LIBELLE HAjoute(NOUVEL_ARTICLE) TableAffiche(TABLE_NOUVEL_ARTICLE) FIN FIN SI gbStop=Vrai GOTO LBL_END HLitSuivant(ARTICLE,IDArticle) FIN LBL_END :
Lorsque j'utilise nbThreadMAX=1 cela fonctionne à la perfection.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 POUR i=1 _A_ nbThreadMAX ThreadExécute("Thread_Check_New_Item"+i,threadNormal,Check_New_Item,nTotal,gnEnCours) Multitâche(20) FIN POUR x=1 _A_ nbThreadMAX TANTQUE ThreadEtat("Thread_Check_New_Item"+x)=threadEnCours Multitâche(-500) // on rend la main à l'appli pendant 5 secondes FIN FIN
La liste se remplit bien avec des articles n'existant pas sur le site.
Problème :
Lorsque j'augmente le nbre de threads à 5, j'ai plusieurs types d'erreurs non bloquantes:
1°) De temps à autres une fenetre "mécanisme de sécurité" s'affiche disant que plusieurs utilisateurs tentent de modifier le même enregistrement ARTICLE ( je suppose lorsque je veux mettre Done à "ok")
Comment éviter ce cas de figure?
2°) il semblerait que lorsqu'il trouve pas un article sur le site en l'ajoutant, il ajoute également d'autres articles qui existent bien sur le site! (ce qui n'arrive jamais avec un seul thread)
J'ai bien sûr essayer tous les modes d'exécution de threads (threadNormal,threadContexteGlobal,threadUtiliseHyperFile) sans succès!
Merci d'avance à ceux qui pourrait m'aguiller sur ce coup
Partager