OVH Cloud OVH Cloud

Threading

2 réponses
Avatar
Francis DUHAUT
Bonjour,

Je teste une appli qui gère un port série en tache de fond pour faite de
l'acquisition de donnée. J'utilise la classe SerialPort du .net framework.

Au démarrage je créé un thread que je lance.

Ce thread envoi une trame de 11 octets et attend en retour une trame de 12
octets. Cela tourne en boucle. Quand j'analyse la charge CPU, elle passe à
100% et les autres appli rame....

J'ai pourtant mis Priority du Thread à lowLevel. Je pense que cela vient de
la boucle d'attente. Je m'explique :

Après l'envoi de ma trame, j'attends une réponse dans un délai max de 40ms.
Pour cela j'utilise <Environment.TickCount> pour calculer le timeout. Cela
donne en gros :

temps1 = Environment.TickCount
tempsMax = temps1 + 40

while (temps1 < tempsMax)
{
if (nb_octets_recus == 12) return True;
temps1 = Environment.TickCount ;
}
return false;

Dans le while je fait tourner le proc à fond. Faudrait peutr être que je
redonne la main au système ?

Il faut utiliser quel fonction ? En Windev (désolé...) il y a
"Multitache(-1)" qui permet de faire cela. Je peux faire un Thread.sleep(1)
?

Merci pour vos conseil
Francis.

2 réponses

Avatar
Francis DUHAUT
Je me réponds.

Effectivement un Thread.sleep(1) bien placé et c'est OK.


"Francis DUHAUT" a écrit dans le message de news:
45747e72$0$21150$
Bonjour,

Je teste une appli qui gère un port série en tache de fond pour faite de
l'acquisition de donnée. J'utilise la classe SerialPort du .net framework.

Au démarrage je créé un thread que je lance.

Ce thread envoi une trame de 11 octets et attend en retour une trame de 12
octets. Cela tourne en boucle. Quand j'analyse la charge CPU, elle passe à
100% et les autres appli rame....

J'ai pourtant mis Priority du Thread à lowLevel. Je pense que cela vient
de la boucle d'attente. Je m'explique :

Après l'envoi de ma trame, j'attends une réponse dans un délai max de
40ms. Pour cela j'utilise <Environment.TickCount> pour calculer le
timeout. Cela donne en gros :

temps1 = Environment.TickCount
tempsMax = temps1 + 40

while (temps1 < tempsMax)
{
if (nb_octets_recus == 12) return True;
temps1 = Environment.TickCount ;
}
return false;

Dans le while je fait tourner le proc à fond. Faudrait peutr être que je
redonne la main au système ?

Il faut utiliser quel fonction ? En Windev (désolé...) il y a
"Multitache(-1)" qui permet de faire cela. Je peux faire un
Thread.sleep(1) ?

Merci pour vos conseil
Francis.






Avatar
Paul Bacelar
Evitez le plus possible les attentes active et utilisez l'événement
DataReceived d'un SerialPort.

http://msdn2.microsoft.com/fr-fr/library/system.io.ports.serialport.datareceived(VS.80).aspx
--
Paul Bacelar
MVP VC++

"Francis DUHAUT" wrote in message
news:45749744$0$21146$
Je me réponds.

Effectivement un Thread.sleep(1) bien placé et c'est OK.


"Francis DUHAUT" a écrit dans le message de
news: 45747e72$0$21150$
Bonjour,

Je teste une appli qui gère un port série en tache de fond pour faite de
l'acquisition de donnée. J'utilise la classe SerialPort du .net
framework.

Au démarrage je créé un thread que je lance.

Ce thread envoi une trame de 11 octets et attend en retour une trame de
12 octets. Cela tourne en boucle. Quand j'analyse la charge CPU, elle
passe à 100% et les autres appli rame....

J'ai pourtant mis Priority du Thread à lowLevel. Je pense que cela vient
de la boucle d'attente. Je m'explique :

Après l'envoi de ma trame, j'attends une réponse dans un délai max de
40ms. Pour cela j'utilise <Environment.TickCount> pour calculer le
timeout. Cela donne en gros :

temps1 = Environment.TickCount
tempsMax = temps1 + 40

while (temps1 < tempsMax)
{
if (nb_octets_recus == 12) return True;
temps1 = Environment.TickCount ;
}
return false;

Dans le while je fait tourner le proc à fond. Faudrait peutr être que je
redonne la main au système ?

Il faut utiliser quel fonction ? En Windev (désolé...) il y a
"Multitache(-1)" qui permet de faire cela. Je peux faire un
Thread.sleep(1) ?

Merci pour vos conseil
Francis.