pupuce54980
Messages postés12Date d'inscriptionlundi 31 juillet 2006StatutMembreDernière intervention11 mai 2008
-
8 mai 2008 à 23:19
pupuce54980
Messages postés12Date d'inscriptionlundi 31 juillet 2006StatutMembreDernière intervention11 mai 2008
-
11 mai 2008 à 16:14
bonjour tout le monde j'ai un petit problème de liaison série et je récupère une erreur "Safe handle has been closed"
j'ai une carte arduino diciemilia avec laquel je communique sur un port com, j'ai aussi une interface graphique sur mon application (de test), le problème c'est que ma carte est comfigurer pour envoyer une chaine de caractère en fonction de l'entrée que l'on active sur celle ci, elle me sert de capteur, donc pour éviter de bloquer mon interface graphique j'ai définie un port serie et un thread
Serialport^ s;
threading t;
t =
gcnew Threading::Thread(
gcnew Threading::ThreadStart(
this, &Form1::ExecuteLongTraitement));
j'ai fait un thread qui lit en continue les lignes que la carte envoye sur la liaison série donc le thread sera toujour bloquer sur l'instruction readline, le soucis c'est que j'ai defois besoin de couper se thread, donc j'ai fait un bouton pour arreter le thread
t->Abord();
mais quand il termine le thread, la liaison série était toujour active et bloquer sur readline et je récupère cette erreur
comment je pourrais faire pour contourné cette erreur car, si je ne lis rien sur la liaison série que je termine le thread je n'ai pas d'erreur meme si j'oublie de fermé la liaison série
cs_akim77
Messages postés73Date d'inscriptionlundi 12 avril 2004StatutMembreDernière intervention17 septembre 20084 9 mai 2008 à 23:50
Salut,
Je ne connait pas bien C++.Net mais je sais qu'il faut que le thread se termine seul.
La méthode simpliste serai d'utiliser une variable globale en remplaçant
while(1) par while(variable_globale) et de mettre variable_globale=0;
quand tu veux que le thread se termine.
Je l'ai déja fait et ça marche mais c'est pas trop "pro" .
pupuce54980
Messages postés12Date d'inscriptionlundi 31 juillet 2006StatutMembreDernière intervention11 mai 2008 11 mai 2008 à 16:12
voila ma source, pour contourné se soucis, j'ai mis une variable global dans ma classe qui s'appelle j, quand je veut tuer mon processus c pas instantanné mais bon c pas si long que ca.
en fait je met cette variable à 1 j'attent 200 milliseconde et je le tue, tandis que mon thread mon thread lit la liaison série avec un timeout de 100 milliseconde, donc toute les 100 milliseconde je peut vérifié l'etat de cette variable, si elle est a 1 je met mon thread dans en attente de 1 seconde. donc le temps de mettre la variable a 1 attendre 2 lecture de la liaison série , pendant se temps la le thread c mis en attente et pas sur une lecture de la liaison serie qui provoque cette erreur, alors la je eput le tuer sans soucis et sans erreur.
pupuce54980
Messages postés12Date d'inscriptionlundi 31 juillet 2006StatutMembreDernière intervention11 mai 2008 10 mai 2008 à 08:26
heu j'ai trouvé aussi une solution en bidouillant avec une variable global et en mettant un timeout sur la liaison série quand je l'initialise, un time out de 10 miliseconde, et ensuite je regarde si une variable global n'est pas a 1, si elle est a un je bloque le thread de 1 seconde le temps pour que mon processus père le tue,
pour la carte arduino diciemilia, c les profs qui me suivent dans mon projet qui l'ont commander a partir du site www.arduino.cc, il y a un seul revendeur en france qui les vendent.
je reviendrais mettre ma source pour la résolution de mon problème d'ici 14 H