Probleme fermeture thread,je trouve pas mon erreur :(

[Résolu]
Signaler
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
-
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
-
Bonjour,

j'ai une application principale qui appelle un composant d'une autre classe.
Ce composant envois à intervale régulier une image au travers d'un evenement.
Dans ce composant, j'ai un thread qui boucle pour récupérer les images et les renvoyer.
J'ai deux procédure pour lancer et arreter la capture.
Dans la form principale j'ai un bouton qui appelle ces procédure. Lors du clic sur le bouton pour arreter la capture, tout fonctionne très bien.
Dans l'evenement du formclosing, j'appelle cette procédure pour arreter la capture et bien fermer mon thread mais ça ne fonctionne pas et je ne comprends, j'ai tourné le truc dans tous les sens mais je ne trouve pas.

Voici les parties intéressante de mon code:

Déclaration du composant de capture:

cam
= new axisStreamMJPG ("http://192.168.0.2/axis-cgi/mjpg/video.cgi","user","pass",500);
cam
.newImg
+ = new axisStreamMJPG
.newImgCaptured(newImage
);

Evenement sur le bouton de la form principale:


void Button1Click(object sender
, System
.EventArgs e
)
{
if(!capturing
)
{
capturing
= true ;
cam
.startCapture();
button1
.Text
= "Stop";
}
else
{
capturing
= false ;
cam
.stopCapture();
button1
.Text
= "Capture";
}
}

Evenement de fermeture de la form principale:


void Form1_FormClosing(object sender
, System
.ComponentModel
.CancelEventArgs e
)
{
capturing
= false ;
cam
.stopCapture();
}

Lancement de la capture:


public void startCapture()
{
connected
=true;
t_capture
= new Thread (new ThreadStart(capture
));
t_capture
.Name
= "t_capture";
t_capture
.Start();
time
.Start();
}

Arret de la capture:


public void stopCapture()
{
connected
= false ;
time
.Stop();
}

Fonction capture appelée par le thread:


private void capture()
{
char[] lastCharRead
= new char[1];
char[] buff
= new char [SIZE_BUFF
];
int nb_read
= -1;
bool write
= false ;
WebRequest myRequest
= System
.Net
.WebRequest
.Create(url
);
if(user
.Length
>0 || pass
.Length
>0 ) myRequest
.Credentials
= new System
.Net
.NetworkCredential(user
, pass
);
WebResponse myResponse myResponse myRequest
. GetResponse ();
StreamReader streamRead
= new System
.IO
.StreamReader(myResponse
.GetResponseStream(),encoding
);
MemoryStream streamImage
= new MemoryStream ();
StreamWriter streamWrite
= new System
.IO
.StreamWriter(streamImage
,encoding
);
while(connected
) //on capture tant qu'on le demande
{
//
//mon traitement ici
//
}
}

Je pense qu'il y a tout pour que vous compreniez mon problème, le fait que le thread de capture ne se fini pas lorsque je clique sur la croix en cours de capture mais s'arrete bien avec le bouton.

Merci de votre aide

f.colo

3 réponses

Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
Merci pour la réponse rapide.
Déjà, vis à vis de ma solution quand à l'arret du thread par la form principale, j'ai trouvé, j'avais oublié de créer l'évènement de formclosing :D:


this
.Closing
+= new System
.ComponentModel
.CancelEventHandler(Form1_FormClosing
);

Maintenant, je recherche à faire un truc bien.
Pour mon composant, j'ai créé une classe vide dans laquelle j'ai crée le composant à regardant à droite à gauche comme faire.
Je n'ai pas mis de Dispose comme dans la form principale où c'est mis automatiquement.


protected override void Dispose(bool disposing
)
{
if (disposing
) {
if (components
! = null
) {
components
.Dispose();
}
}
base
.Dispose(disposing
);
}

Pourrais-tu me dire comme je dois faire le dispose? Dois-je faire comme pour la form principale?

Merci

f.colo
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
je pense que tu prends le problème à l'envers...

ce n'est pas au formulaire d'arrêter le thread... mais au composant lui-même.

Donc, dans le Dispose du composant, il faut que arrête ton timer.


Sébastien FERRAND (
blog)
[Microsoft MVP Visual C#]
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
Vis à vis du timer, il ne genere que l'evenement à intervale régulier, ce n'est pas dans ce dernier que j'effectue la capture.

Déclaration:

private System
.Timers
.Timer time
;
private double defaultTimeInterval
= 500;

Initilisation:


time
= new System
.Timers
.Timer();
time
.Elapsed
+ = new System
.Timers
.ElapsedEventHandler(timeElapse
);
time
.Interval
= defaultTimeInterval
;

Evenement:


private void timeElapse(object sender
, System
.Timers
.ElapsedEventArgs e
)
{
if(newImg
! =null
) newImg(img
);
}

Voila :)

f.colo