|
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. ) 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. |
| |
| |
| | | |
|
| | | | |
| | |
|