Les Thread
Developpeur WDF
Inscrit:
26/07/2004 09:01
Post(s): 127
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 )

Contribution le : 16/07/2007 10:39
_________________
Faut pas trop se prendre au sérieux ...
Créer un fichier PDF de la contribution Imprimer


Re: Les Thread
Developpeur WDF
Inscrit:
18/06/2006 13:54
Post(s): 106
Je ne m'y connais pas trop en thread mais... si tu fais un clique droit sur ta procedure PL_threadPing, ensuite propriété, tu devrais avoir dans la derniere partie une option qui fait référence aux thread, active là... si ce n'est pas déjà fait :)

Ou alors dnas la déclaration globale de ton projet, fais appele à la fonction ThreadMode()

Autre chose que j'ai vu dans l'aide de la focntion ThreadMode :
"Rappel : les sections critiques permettent de protéger une section de code : cette section de code ne pourra être exécutée que par un seul thread à la fois."
Tu possèdes dans ton code une section critique.

J'espere avoir pu t'aider... ou pas :p


Cordialement

Contribution le : 16/07/2007 14:08
Créer un fichier PDF de la contribution Imprimer


Re: Les Thread
Developpeur WDF
Inscrit:
26/07/2004 09:01
Post(s): 127
Merci beaucoup

Alors en fait seul le ThreadMode(threadSectionCritique) est nécessaire.

Par contre j'ai du modifier un bout de Code :
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")

chRes est une chaîne
chCodeàCompiler est une chaîne


SectionCritiqueDébut(plFen)

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


/////Ici on déclare une variable par Thread
chCodeàCompiler="GLOBAL"+RC+"MyDos"+plFen+" est un MultiPING"
chRes=Compile("CompilePing",chCodeàCompiler)

SI chRes="" ALORS
	ExécuteTraitement("CompilePing", trtProcédure)
	MDIOuvre(frmMain,plFen)
	{"MyDos"+plFen}:CommandLine_Let(plCommande)
	{"MyDos"+plFen}:ExecuteCommand(plFen)
FIN

SectionCritiqueFin(plFen)


Il ne me reste plus qu'à gérer la suppression des Thread.

Au fait,
merci à DrCharly93 pour sa Classe cWDDos

Contribution le : 16/07/2007 14:49
_________________
Faut pas trop se prendre au sérieux ...
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2