[c#]Limiter utilisation du CPU, travail flux video

cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 - 22 févr. 2006 à 10:58
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 - 22 févr. 2006 à 17:30
Bonjours tout le monde,
j'ai devellopper une application de capture de flux mjpg.
Malheureusement, elle me consomme énormément de CPU.
Je souhaiterai savoir comment diminuer cette utilisation.
Mon code:

private
void CaptureMJPeg()
{

WebRequest myRequest;

StreamReader streamRead =
null;

Stream myStream;

WebResponse myResponse;
Encoding encoding = System.Text.
Encoding.GetEncoding(
"iso-8859-1");

char forallMASK =
Convert.ToChar(255);
//OxFF
char InitImgMASK =
Convert.ToChar(216);
//OxD8 debut de l'image
char EndImgMASK =
Convert.ToChar(217);
//OxD9 fin de l'image
char first =
Convert.ToChar(0);

char[] second =
new
char[1];

while (!endOfCapture)
{

try
{
myRequest = System.Net.
WebRequest.Create(IP);
myRequest.Credentials =
new System.Net.
NetworkCredential(User, Pass);
myResponse = myRequest.GetResponse();
myStream = myResponse.GetResponseStream();
streamRead =
new System.IO.
StreamReader(myStream, encoding);

//while (!endOfCapture)
//{
ArrayList myAL =
new
ArrayList();
//recherche du début de l'image

while ((first.CompareTo(forallMASK) != 0) || (second[0].CompareTo(InitImgMASK) != 0))
{
first = second[0];
streamRead.Read(second, 0, 1);
}
//une fois au début de l'image

while ((first.CompareTo(forallMASK) != 0) || (second[0].CompareTo(EndImgMASK) != 0))
{
//on enregistre tous les char jusqu'a la fin de l'image
myAL.Add(first);
first = second[0];
streamRead.Read(second, 0, 1); //on lit char après char
}
myAL.Add(first);
myAL.Add(second);

byte[] image = getByteArrayList(myAL); //on transforme le flux en image
thePictureBox.Image = insertTextToStream(image);

//}
streamRead.Close();
myStream.Close();
}

catch (
WebException e1)
{

Console.WriteLine(
"WebExecption e1:" + e1.ToString());
}
}

J'ai essayé 2 facon (//while (!endOfCapture)), en fermant le flux après chaque réception ou en le laissant ouvert en permanence (solution la plus logique mais la plus gourmande, 100% cpu)

Savez vous comment je peux faire pour diminuer la consommation du cpu?
Je travaille sous visual studio 2005, en c#.

f.colo

4 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
22 févr. 2006 à 11:59
Ajoute un Application.DoEvents() dans ta boucle


Sébastien FERRAND (
blog)
[Microsoft MVP Visual C#]
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
22 févr. 2006 à 14:36
Salut, j'ai fait comme tu m'as dis, j'ai intégré cet appel de fonction dans ma boucle while (ca semble servir à continuer à travailler même en background si j'ai bien lu )
Je travaille avec un pentium 4 2.8Ghz et il est (avec ou sans le DoEvent() ) à 100% si je garde le flux ouvert et 50% sinon.

Quelqu'un à une autre solition?

Merci sebmafate

f.colo
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
22 févr. 2006 à 17:17
Salut, j'ai pas trop regardé ce que fais ton code mais si tu as une boucle while qui consomme tout le CPU tu peux utiliser un autre thread avec la méthode Sleep, faut voir si ça correspond pour ce que tu veux faire :

Thread t = new Thread( new ThreadStart( MyFunction ) );
t.IsBackground = true;
//t.Priority = ThreadPriority.Lowest;
t.Start( );


protected void MyFunction( )
{
while( true )
{
// Ici le code ta boucle


Thread.Sleep( 50 );
}
}

Tu peux regarder aussi Application.Idle.
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
22 févr. 2006 à 17:30
Merci lutinore mais mon application ne me permet pas d'attendre.
Je recois un flux en permanence et je ne peux me permettre de perdre des images dans ce flux MJPG.
Par contre, je ne suis pas contre un remanimant de ma structure de reception du flux.
Peut etre que je m'y prends mal et c'est ce qui consomme du CPU mais je ne vois pas comment faire autrement, ca me parait logique ma facon de faire et je ne vois pas d'autre facon.

f.colo
0
Rejoignez-nous