execution d'un thread secondaire
Developpeur WDF
Inscrit:
21/06/2005 18:17
Post(s): 115
Bonjour,

Je dois dans mon appli lancer un thread secondaire qui tourne tant qu'un booléen n'est pas a faux.

Mon problème est que quand je lance ce thread mon appli est ralentie et certains traitements ne sont plus exécutés.

Je me tourne vers vous pour trouver une solution a mon problème.

Comment faire tourner dans un autre process mon traitement qui doit tourner en tâche de fond.

Contribution le : 07/02/2006 15:27
Créer un fichier PDF de la contribution Imprimer


Re: execution d'un thread secondaire
Anonyme
A mon avis dans la fonction de ton thread tu fais une boucle continue pour vérifier si le booleen a la valeur faux ?

Si tu ne veux pas que le thread bouffe de la ressource tu as deux solutions je te les mets dans l'ordre de préférence niveau performance :

1-Remplacer le booleen par un signal.
Le thread secondaire au lieu de boucler sans cesse fait :

tantque 1 
threadAttendsignal()
fin



Quand le thread primaire mettre le booleen na un alors tu fais

ThreadEnvoiSignal(Nom_Thread_Secondaire


2-Mettre dans ta boucle de controle du booleen un multitache( -50)

Poste du code si tu veux qu'on aide plus.

Contribution le : 07/02/2006 17:52
Créer un fichier PDF de la contribution Imprimer


Re: execution d'un thread secondaire
Developpeur WDF
Inscrit:
21/06/2005 18:17
Post(s): 115
Voila en faite dans la procédure appelée par mon thread je faits la chose suivante :

Je lance une appli externe qui créer un fichier texte et le rempli.

Une fois que le pro est lancé et que le fichier a été créer je fait une boucle qui tourne tant que mon booléen ne passe pas a faut.

Dans cette boucle j'ouvre le fichier je lit une ligne, je retiens ma position dans mon fichier.
Si la ligne que j'ai lue est différente de la fin de fichier j'appel une procédure qui analyse ce que j'ai récup et fait des traitements en fonction.


	BOUCLE
		vDoc = fOuvre(<mon_fichier_txt>,foLecture)
		SI vDoc<>-1 ALORS
				SI PositionEnCours<>0 ALORS
					fPositionne(vDoc,PositionEnCours,fpDébut)
				FIN
				PageWeb = fLitLigne(vDoc)
				PositionEnCours = fPositionne(vDoc, 0, fpCourant)
				SI (PageWeb=EOT) ALORS //(PageWeb="")ET
					attente = Vrai
					Message("Attente = vrai")
				SINON
					Message("")
					<ma_procedure>(PageWeb)	
				FIN
				res est un entier = fFerme(vDoc)
				SI res = -1 ALORS
					// Affichage du message d'erreur si la fermeture n'a pas été effectuée 
					//Erreur(ErreurInfo( errMESSAGE ))
				FIN			
				SI attente=Vrai ALORS
					Multitâche(-100)
					attente=Faux
				FIN	
		FIN
	A FAIRE TANTQUE CtiVoIP=Vrai
	ThreadArrête("mon_thread")


Voila mon code avec l'ajout d'un multitâche(-100) comme vous me l'avez conseillez dans le poste précédent.
Avec le multitâche ça fonctionne mais l'appli est tout de même un peu moins réactive que lorsque le thread secondaire ne tourne pas.
Peut-etre pourrez vous m'aider à optimiser mon code.

Contribution le : 08/02/2006 11:07
Créer un fichier PDF de la contribution Imprimer


Re: execution d'un thread secondaire

Inscrit:
19/11/2002 12:20
Post(s): 390
1°) [Mode énervé ON]
Arf, encore du multitache dans un thread... passons puisque apparemment tout le monde s'en fiche... normalement il faut remplacer multitache par threadattendsignal dans un thread, genre:
threadattendsignal(1) au lieu d'un multitache(-1) mais je suppose que tant les procédures n'explosent pas, tout le monde s'en fiche...
[Mode énervé placide]

2°) un truc pour voir si le fichier a changé d'un coup sur l'autre, plutôt que l'ouvrir à chaque fois, compare tout bêtement la taille du fichier... Si la taille a changé, c'est que des trucs ont été rajoutés dans le fichier.
D'autre part, il vaut mieux ouvrir une fois le fichier et le fermer une fois...
Genre:
J'ouvre le fichier

Je boucle et récupère ce qu'il rajoute au fur et à mesure (de la dernière position de mon pointeur qui est mis à jour automatiquement si tu utilises flit, plus besoin de fpositionne) jusqu'à la fin du fichier... etc...

je ferme le fichier


3°) la commande flitligne est certes pratique, elle est néanmoins trèèèèèèèèèès lente comparée à un flit "tout court". Alors certes, tu es obligé de dire combien d'octets tu lis, de détecter toi même ta fin de ligne, ce genre de chose, mais c'est assez rapide, et au bout de "x" lectures, la différence de performance est très importante, essaie, tu verras.

Contribution le : 08/02/2006 14:29
Créer un fichier PDF de la contribution Imprimer


Re: execution d'un thread secondaire
Developpeur WDF
Inscrit:
21/06/2005 18:17
Post(s): 115
donc si j'ai bien compris je doit remplacer mon multitache(-100) par un threadattendsignal(100) ??

Mais pares je vois pas du tout comment faire !

Contribution le : 08/02/2006 15:51
Créer un fichier PDF de la contribution Imprimer


Re: execution d'un thread secondaire

Inscrit:
19/11/2002 12:20
Post(s): 390
Citation :

JeromeR a écrit:
donc si j'ai bien compris je doit remplacer mon multitache(-100) par un threadattendsignal(100) ??

Mais pares je vois pas du tout comment faire !


Ouaip, même "1" tout court ou "10" ça devrait suffire, mais c'est une question de tests ensuite.

Et qu'est ce que vous ne voyiez pas comment faire?

Contribution le : 09/02/2006 11:22
Créer un fichier PDF de la contribution Imprimer


Re: execution d'un thread secondaire
Developpeur WDF
Inscrit:
21/06/2005 18:17
Post(s): 115
Je ne vois pas comment faire la lecture de mon fichier ligne par ligne sans utiliser de fposionne et flitligne.

Contribution le : 09/02/2006 13:57
Créer un fichier PDF de la contribution Imprimer


Re: execution d'un thread secondaire

Inscrit:
19/11/2002 12:20
Post(s): 390
Euh...

Ben imaginons que le fichier contienne à un instant "t" qui a une taille T1:
abcdefrehfiehfihrfhrfo
frhfiehfi
friejfoierjfioejfoijerfoijeroifj
forforjfojforjforjfojrfojrofjorfjorjfor


donc vous le lisez, puis vous voyez que la taille change, donc que des octets ont été rajoutés (fichier a la taille T2):
abcdefrehfiehfihrfhrfo
frhfiehfi
friejfoierjfioejfoijerfoijeroifj
forforjfojforjforjfojrfojrofjorfjorjfor
llllllllllllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmmmmm


Comme vous avez utlisé le "flit", vous êtes déjà positionné à la fin de la ligne "forforjfojforjforjfojrfojrofjorfjorjfor"
Donc si vous faites un flit de "x" octets (T2-T1), vous aurez en mémoire:
llllllllllllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmmmmm

et votre pointeur sera à la fin de la ligne des "m"...

Après, il suffit de détecter les "RC" (RC = \r\n ou caract(10)+caract(13)) (ou caract(10) ou caract(13) selon le type de renvoi à la ligne) et de faire une boucle...
Genre:
ch_org contenant "llllllllllllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmmmmm"

nb_lig=chaineoccurrence(ch_org,RC)
nb_lig++ //on rajoute un car si on a:
         // ligne1 RC ligne2, il y a 2 lignes à traiter pour 1 RC

for k=1 to nb_lig
  temp=extraitchaine(ch_org,k,RC)
  //traiter la ligne contenue dans temp
end


A affiner bien sûr...



Autre cas, si vous n'avez pas une ligne complète, genre:
llllllllllllllllllllllllllllllll
mmmm


et plus tard:
llllllllllllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmmmmm
nnnnnnnnnnnnnnnnn


il faudra détecter donc que la ligne des "m" était incomplète (il manquait le RC à la fin par exemple ou longueur de la chaîne etc...) et garder pour le flit d'après donc
mmmm

dans une variable, genre:
ch_org=flit(no_fichier,nombre_octets)
ch_org=last_buffer+ch_org //on rajoute le buffer de l'autre fois, les "m" non traités.

Contribution le : 09/02/2006 14:56
Créer un fichier PDF de la contribution Imprimer


Re: execution d'un thread secondaire
Developpeur WDF
Inscrit:
21/06/2005 18:17
Post(s): 115
le pointeur reste a la fin du fichier meme si je le ferme ?

Contribution le : 09/02/2006 15:12
Créer un fichier PDF de la contribution Imprimer


Re: execution d'un thread secondaire

Inscrit:
19/11/2002 12:20
Post(s): 390
Citation :

JeromeR a écrit:
le pointeur reste a la fin du fichier meme si je le ferme ?


Nan, il faut laisser le fichier ouvert :)

Mais tu n'as pas besoin de fermer le fichier si tu l'ouvres en lecture seule, le programme qui remplit le fichier ne verra rien du tout et continuera à le remplir.

Contribution le : 09/02/2006 18:59
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