Les Thread

Posté par veDengaG le 16/7/2007 10:39:45
Bonjour,

on m'a demandé si je pouvais créer une appli permettant de visualiser plusieurs "ping" en même temps.
Bien que sur le Net on en trouve, la personne souhaite quelque chose de plus léger.

Je me suis donc inspiré de WDDos (merci :) ), et j'ai tenté de reproduire la même chose qu'avec l'exemple "Pool de Thread" de Windev, sauf que je n'obtiens pas le même résultat.

J'utilise le mode MDI.

Les codes :
Initialisation de la Fenêtre Mère
// On supprime l'ancien Sémaphore si existant
SémaphoreDétruit("SEM_LIMITE")

// On recrée le sémaphore
SémaphoreCrée("SEM_LIMITE",po_NBFEN..Valeur)


// On peut modifier le nombre de thread dans le pool
po_NBFEN..Etat = Actif //po_NBFEN est un POtentiomètre


RepriseSaisie(cs_Adresse)



Click sur bc_Ping
chNomThread est une chaîne
chNomAlias est une chaîne
chCommande est une chaîne

//cs_Adresse est le Champ de Saisie où l'on indique l'adresse à "pinger"
chNomThread="THREAD_"+Remplace(cs_Adresse,".","")
chNomThread=Remplace(chNomThread,"/","")
chNomThread=Remplace(chNomThread,":","")

chNomAlias=Remplace(chNomThread,"THREAD_","FEN_")

//Exemple :
//Pour le Ping de 127.0.0.1 on aura 
//FEN_127001 et THREAD_127001
//et www.google.fr donnera
//FEN_wwwgooglefr et THREAD_wwwgooglefr
chCommande="PING "+cs_Adresse+" -t"

SI FenEtat(chNomAlias)=Inexistant ALORS
	Sablier(Vrai)
	
	// On ne peut plus modifier le nombre de thread dans le pool
	po_NBFEN..Etat = Grisé 
	
	// On exécute le thread
	ThreadExécute(chNomThread,threadNormal,PL_ThreadPing,chNomAlias,chCommande )
	
	// On attend que le thread se soit lancé
	ThreadAttendSignal()

	Sablier(Faux)
	
SINON
	MDIActive(	Remplace(chNomThread,"THREAD_","FEN_"))
FIN


PROCEDURE PL_ThreadPing(plFen, plCommande)
// On indique que le thread s'est chargé et lancé
ThreadEnvoieSignal(".")

// Contrôle du nombre de thread à un instant t grâce aux sémaphores
SémaphoreDébut("SEM_LIMITE")


SectionCritiqueDébut(plFen)

MDIOuvre(frmMain,plFen, ExtraitChaîne(plFen,1,"_",DepuisFin))
gclMyDos:CommandLine_Let(plCommande)
gclMyDos:ExecuteCommand(plFen)

SectionCritiqueFin(plFen)


Message d'erreur, lorsque je tente d'exécuter un autre ping :

Le nouveau thread 'THREAD_1921681200' doit exécuter la procédure 'PL_ThreadPing' qui est déjà en cours d'exécution par le thread 'THREAD_19216811'. Pour autoriser plusieurs threads à exécuter la même procédure, il faut paramètrer le mode de gestion des threads par la fonction ThreadMode.


Conclusion :
Eh bien je patauge, je pense que le problème vient de la classe, ça ne doit pas être compatible.
Et de plus je ne comprends pas le message d'erreur étant donné que dans l'exemple le "ThreadMode" n'est pas utilisé.

Prière :
HELP !
(A noter que ce n'est pas urgent du tout )

Cette contribution était de : http://old.wdforge.org/newbb/viewtopic.php?forum=17&topic_id=5272&post_id=21811