PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Gros soucis avec le mutli Threading
Gros soucis avec le mutli Threading
Iniciado por nicossimo53, 18,nov. 2004 17:37 - 14 respuestas
Publicado el 18,noviembre 2004 - 17:37
Bonjour tout le monde,
voilà j'ai une application permettant d'envoyer un fichier à plusieurs postes connectés en réseaux. j'ai une table contenant les différents postes et dans cette table j'ai une colonne affichant une jauge de progression de l'émission pour le poste concerné.
Voilà, vu que les envois doivent se faire de manière simultanée, je souhaite mettre un thread appelant une procédure affichant la progression. C'est à dire que l'envoi du fichier au poste N+1 est lancé tout de suite après l'envoi au poste N.
Si vous avez des conseils merci de me répondre
A bientôt
Nico.
Publicado el 18,noviembre 2004 - 21:08
Salut,

je te conseil d'explorer l'exemple WD8 Threads FTP livré avec la lst 57


Mathieu
Publicado el 18,noviembre 2004 - 22:02
"Nico" <nicossimo53@hotmail.com> écrivait
news:419cb7ef$1@news.pcsoft.fr:

Voil…, vu que les envois doivent se faire de maniŠre simultan‚e, je
souhaite mettre un thread appelant une proc‚dure affichant la
progression. C'est … dire que l'envoi du fichier au poste N+1 est
lanc‚ tout de suite aprŠs l'envoi au poste N.


Salut,

Cela me rappel un exemple de LST qui fait de l'envoi/recup FTP en multi-
thread.

http://www.webdev.info/publicationSt_WEB/FR/recherche.awp…

--
En esperant t'avoir aidé.
ted
Publicado el 19,noviembre 2004 - 10:24
----- Original Message -----
From: "Nico" <nicossimo53@hotmail.com>
Newsgroups: pcsoft.fr.windev
Sent: Thursday, November 18, 2004 4:37 PM
Subject: Gros soucis avec le mutli Threading



Bonjour tout le monde,
voilà j'ai une application permettant d'envoyer un fichier à plusieurs
postes connectés en réseaux. j'ai une table contenant les différents
postes et dans cette table j'ai une colonne affichant une jauge de
progression de l'émission pour le poste concerné.
Voilà, vu que les envois doivent se faire de manière simultanée, je
souhaite mettre un thread appelant une procédure affichant la progression.
C'est à dire que l'envoi du fichier au poste N+1 est lancé tout de suite
après l'envoi au poste N.
Si vous avez des conseils merci de me répondre
A bientôt
Nico.



pardon mais je ne comprends pas :
"les envois doivent se faire de manière simultanée" et "l'envoi du fichier
au poste N+1 est lancé tout de suite après l'envoi au poste N" me
confusionne. :o)
et en gros quel est le problème ?
Je vais répondre dans les deux cas :

Dans le premier cas, si les envois se font en simultané, tu lances les
threads en leur donnant un nom variable par rapport au nombre de poste
(thread_poste_1, thread_poste_2 ...), tu verras la progression en prenant
pour valeur max la taille totale du fichier.

Dans le second cas, si les envois doivent se faire les uns à la suite des
autres, alors il faut utiliser un truc du style :
pour chaque poste
ThreadExécute("nom_de_mon_thread",threadNormal,procedure_d_envoi)
BOUCLE
SI ThreadAttend("nom_de_mon_thread") ALORS SORTIR
FIN
fin
Voilà, j'espère avoir répondu à la question sinon c'est que je ne l'ai pas
comprise ;)
D.
Publicado el 19,noviembre 2004 - 11:33
Merci à tous por vos réponse,
Mais voilà ce que j'essaie :

POUR i = 1 A TableOccurrence(TBL_PLAT)
TableSelectPlus(TBL_PLAT,i)
ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier")
AjoutInfo("Thread"+i+" "+TBL_PLAT.B_ENVOI)
FIN

Cette solution a pour conséquence de générer l'erreur suivante: Lors de l'éxécution du second Thread, il me dit que la procédure EnvoiFichier est déjà utilisée, ce qui est logique.
Alors j'ai tenté d'utiliser une sémaphore mais je vous avoue que je ne suis pas très à l'aise avec l'utilisation de ces commandes. Alors ça n'a pas fonctionné non plus. Il me disait, au passage sur l'instruction SemaphoreFin("SEMA"), qu'il ne pouvait fermer une sémaphore qui n'avait pas été ouverte, or j'avais bien mis l'instruction SemaphoreDebut("SEMA") avant la zone de code protégé.
Voilà là je suis en train de voir avec une procédure dynamique ce qui va me permette de supprimer l'utilisation des sémaphores mais qui va s'avérer délicat car la procédure dynamique va devoir appeler 2 autres procédures du projets.
Donc voilà, si vous pensez que l'utilisation des sémaphores est préférable, aidez-moi s'il vous plait.

Merci.
Nico...
Publicado el 19,noviembre 2004 - 11:52
"Nico" <nicossimo53@hotmail.com> a écrit dans le message de news:
419db407$1@news.pcsoft.fr...

Merci à tous por vos réponse,
Mais voilà ce que j'essaie :

POUR i = 1 A TableOccurrence(TBL_PLAT)
TableSelectPlus(TBL_PLAT,i)
ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier")
AjoutInfo("Thread"+i+" "+TBL_PLAT.B_ENVOI)
FIN

Cette solution a pour conséquence de générer l'erreur suivante: Lors de
l'éxécution du second Thread, il me dit que la procédure EnvoiFichier est
déjà utilisée, ce qui est logique.
Alors j'ai tenté d'utiliser une sémaphore mais je vous avoue que je ne
suis pas très à l'aise avec l'utilisation de ces commandes. Alors ça n'a
pas fonctionné non plus. Il me disait, au passage sur l'instruction
SemaphoreFin("SEMA"), qu'il ne pouvait fermer une sémaphore qui n'avait
pas été ouverte, or j'avais bien mis l'instruction SemaphoreDebut("SEMA")
avant la zone de code protégé.
Voilà là je suis en train de voir avec une procédure dynamique ce qui va
me permette de supprimer l'utilisation des sémaphores mais qui va s'avérer
délicat car la procédure dynamique va devoir appeler 2 autres procédures
du projets.
Donc voilà, si vous pensez que l'utilisation des sémaphores est
préférable, aidez-moi s'il vous plait.

Merci.
Nico...


qu'est ce que c'est que cette fonction : AjoutInfo ?

car Attention : cette procédure ne doit pas contenir d'appel au débogueur
(ni point d'arrêt, ni mot clé STOP, ni expression auto-stop, ...). Les
appels aux fonctions Info, Erreur, ... bloquent tous les threads en cours
d'exécution.

je teste pour le reste ...
Publicado el 19,noviembre 2004 - 12:08
"Nico" <nicossimo53@hotmail.com> a écrit dans le message de news:
419db407$1@news.pcsoft.fr...

Merci à tous por vos réponse,
Mais voilà ce que j'essaie :

POUR i = 1 A TableOccurrence(TBL_PLAT)
TableSelectPlus(TBL_PLAT,i)
ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier")
AjoutInfo("Thread"+i+" "+TBL_PLAT.B_ENVOI)
FIN

Cette solution a pour conséquence de générer l'erreur suivante: Lors de
l'éxécution du second Thread, il me dit que la procédure EnvoiFichier est
déjà utilisée, ce qui est logique.
Alors j'ai tenté d'utiliser une sémaphore mais je vous avoue que je ne
suis pas très à l'aise avec l'utilisation de ces commandes. Alors ça n'a
pas fonctionné non plus. Il me disait, au passage sur l'instruction
SemaphoreFin("SEMA"), qu'il ne pouvait fermer une sémaphore qui n'avait
pas été ouverte, or j'avais bien mis l'instruction SemaphoreDebut("SEMA")
avant la zone de code protégé.
Voilà là je suis en train de voir avec une procédure dynamique ce qui va
me permette de supprimer l'utilisation des sémaphores mais qui va s'avérer
délicat car la procédure dynamique va devoir appeler 2 autres procédures
du projets.
Donc voilà, si vous pensez que l'utilisation des sémaphores est
préférable, aidez-moi s'il vous plait.

Merci.
Nico...


bien alors ca y est j'ai trouvé il faut avant ta boucle utiliser la fonction
suivante :
ThreadMode(threadSectionCritique)
Cela permettra à ta procédure EnvoiFichier d'être utilisée pls fois en même
temps.
Publicado el 19,noviembre 2004 - 12:13
Non cette procédure me sert juste à écrire des informartions relatifs aux transferts dans un fichier LOG. il n'y a aucun point d'arrêt ni de RETOUR ou SORTIR mais seulement des ordres d'écritures dans un fichier.
Donc le problème ne vient pas de là...
Publicado el 19,noviembre 2004 - 13:43
Merci Dany mais j'avais déjà placé ThreadMode(ThreadSectionCritique) dans l'initailisation de ma fenêtre et ça ne change rien.
En tout cas il y a du changement, j'ai laissé tombé la procédure dynamique et je me suis remis sur les sémaphores et ça commence a bien tourné, voici un bout de mon code :

SémaphoreDétruit("S1")
SémaphoreCrée("S1")
POUR i = 1 A TableOccurrence(TBL_PLAT)
TableSelectPlus(TBL_PLAT,i)
SI TBL_PLAT.B_MAJ_AUTO = 2 ET TBL_PLAT.B_PROG = 2 ALORS
ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier",i)
ThreadAttendSignal()
gNbEnvoi++
FIN
FIN

voilà la variable que j'incémente me permet de savoir le nombre de fichier que j'envoie, elle me sert aussi lors de l'arrêt des envois.
Par contre je ne suis pas sûr que ce code me permet d'envoyer mon fichier sur tous les postes du réseau en même temps. Je crains que l'envoie au poste 2 se fait uniquement après réception du fichier par le poste 1.
Qu'en pense-tu?
En tout cas merci pour l'aide que tu m'as apportée.
Nico.
Publicado el 19,noviembre 2004 - 15:56
"Nico" <nicossimo53@hotmail.com> a écrit dans le message de news:
419dd27f@news.pcsoft.fr...

Merci Dany mais j'avais déjà placé ThreadMode(ThreadSectionCritique) dans
l'initailisation de ma fenêtre et ça ne change rien.
En tout cas il y a du changement, j'ai laissé tombé la procédure dynamique
et je me suis remis sur les sémaphores et ça commence a bien tourné, voici
un bout de mon code :

SémaphoreDétruit("S1")
SémaphoreCrée("S1")
POUR i = 1 A TableOccurrence(TBL_PLAT)
TableSelectPlus(TBL_PLAT,i)
SI TBL_PLAT.B_MAJ_AUTO = 2 ET TBL_PLAT.B_PROG = 2 ALORS

ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier",i)
ThreadAttendSignal()
gNbEnvoi++
FIN
FIN

voilà la variable que j'incémente me permet de savoir le nombre de fichier
que j'envoie, elle me sert aussi lors de l'arrêt des envois.
Par contre je ne suis pas sûr que ce code me permet d'envoyer mon fichier
sur tous les postes du réseau en même temps. Je crains que l'envoie au
poste 2 se fait uniquement après réception du fichier par le poste 1.
Qu'en pense-tu?
En tout cas merci pour l'aide que tu m'as apportée.
Nico.


Je n'ai pas testé avec les sémaphores.
Mais en principe si tu arrives à faire tourner tous tes threads à la fois,
il n'y a pas de raison, c'est vraiment curieux que cela n'ait pas fonctionné
avec le mode en section critique.

Mais j'ai une question, comment tu fais pour avoir une jauge de progression
dans une colonne de tableau. Ca m'intrigue ...
A moins que windev8 le fasse ? je suis en windev7.5
Publicado el 19,noviembre 2004 - 17:10
En fait, j'ai une jauge en dehors de ma fenêtre et j'utilise un champ clone à chaque ligne de mon tableau en lui donnant l'indice de ma ligne (JaugeL<indice>).

Quand je lance ma procédure, je vois les jauges se remplir les une après l'autre or je voudrais qu'elle se remplissent simultanément, en "canon".
La seconde commence à se remplir avant que la première soit terminée.

Là je cale un peu mais il faut absolument que je trouve.

Voilà, qu'est ce que t'en dis.

Nico.
Publicado el 19,noviembre 2004 - 17:34
"Nico" <nicossimo53@hotmail.com> a écrit dans le message de news:
419e0312@news.pcsoft.fr...

En fait, j'ai une jauge en dehors de ma fenêtre et j'utilise un champ
clone à chaque ligne de mon tableau en lui donnant l'indice de ma ligne
(JaugeL<indice>).

Quand je lance ma procédure, je vois les jauges se remplir les une après
l'autre or je voudrais qu'elle se remplissent simultanément, en "canon".
La seconde commence à se remplir avant que la première soit terminée.

Là je cale un peu mais il faut absolument que je trouve.

Voilà, qu'est ce que t'en dis.

Nico.



ce que j'ai testé moi c'est :
une fenetre avec à l'interieur 2 jauges et un bouton
dans le code du bouton j'ai :
Jauge1..BorneMax = 1000000
Jauge2..BorneMax = 1000000
ThreadMode(threadSectionCritique)
ThreadExécute("mon_thread1",threadNormal,"ma_procedure","jauge1")
ThreadExécute("mon_thread2",threadNormal,"ma_procedure","jauge2")

ma procédure est une procédure locale de la fenetre dont le code est :
PROCEDURE ma_procedure(ma_jauge)
i est un entier
POUR i = 1 A 1000000
{ma_jauge}..Valeur = i
MultitacheRepeint(Fenêtre1)
FIN

et quand je clique sur le bouton, j'ai un super canon de jauge :)))
j'aurai pu tester en faisant une boucle pour les threads mais j'imagine que
ca ferait la meme chose
tiens je v essayer ...
Publicado el 19,noviembre 2004 - 17:43
"dany" <dany@hotmail.com> a écrit dans le message de news:
419df298$1@news.pcsoft.fr...


"Nico" <nicossimo53@hotmail.com> a écrit dans le message de news:
419dd27f@news.pcsoft.fr...

Merci Dany mais j'avais déjà placé ThreadMode(ThreadSectionCritique) dans
l'initailisation de ma fenêtre et ça ne change rien.
En tout cas il y a du changement, j'ai laissé tombé la procédure
dynamique
et je me suis remis sur les sémaphores et ça commence a bien tourné,
voici
un bout de mon code :

SémaphoreDétruit("S1")
SémaphoreCrée("S1")
POUR i = 1 A TableOccurrence(TBL_PLAT)
TableSelectPlus(TBL_PLAT,i)
SI TBL_PLAT.B_MAJ_AUTO = 2 ET TBL_PLAT.B_PROG = 2 ALORS

ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier",i)
ThreadAttendSignal()
gNbEnvoi++
FIN
FIN

voilà la variable que j'incémente me permet de savoir le nombre de
fichier
que j'envoie, elle me sert aussi lors de l'arrêt des envois.
Par contre je ne suis pas sûr que ce code me permet d'envoyer mon fichier
sur tous les postes du réseau en même temps. Je crains que l'envoie au
poste 2 se fait uniquement après réception du fichier par le poste 1.
Qu'en pense-tu?
En tout cas merci pour l'aide que tu m'as apportée.
Nico.


Je n'ai pas testé avec les sémaphores.
Mais en principe si tu arrives à faire tourner tous tes threads à la fois,
il n'y a pas de raison, c'est vraiment curieux que cela n'ait pas
fonctionné
avec le mode en section critique.

Mais j'ai une question, comment tu fais pour avoir une jauge de
progression
dans une colonne de tableau. Ca m'intrigue ...
A moins que windev8 le fasse ? je suis en windev7.5



ben oui ca marche avec la meme procédure locale de la fenetre que le message
précédent et dans le code du bouton :

i est un entier

POUR i = 2 A 7
ChampClone(Jauge1,"Jauge"+i,Jauge1..XInitial,Jauge1..YInitial+(30*i-1))
FIN
POUR i = 1 A 7
{"Jauge"+i}..BorneMax = 100000
FIN

ThreadMode(threadSectionCritique)
POUR i = 1 A 7
ThreadExécute("mon_thread"+i,threadNormal,"ma_procedure","jauge"+i)
FIN

un joli canon de 7 jauges ...
comment ca se fait que ca fonctionne pas chez toi
il doit y avoir un truc dans ta procedure "envoifichier"
Publicado el 19,noviembre 2004 - 17:49
"Nico" <nicossimo53@hotmail.com> a écrit dans le message de news:
419e0312@news.pcsoft.fr...

En fait, j'ai une jauge en dehors de ma fenêtre et j'utilise un champ
clone à chaque ligne de mon tableau en lui donnant l'indice de ma ligne
(JaugeL<indice>).

Quand je lance ma procédure, je vois les jauges se remplir les une après
l'autre or je voudrais qu'elle se remplissent simultanément, en "canon".
La seconde commence à se remplir avant que la première soit terminée.

Là je cale un peu mais il faut absolument que je trouve.

Voilà, qu'est ce que t'en dis.

Nico.



dernier message je pars en vacances une semaine !
tchaoo
Publicado el 19,noviembre 2004 - 19:08
Merci pour ton aide je testerai ce week end
Je te souhaite de bonnes vacances
Bye
Nico.