Thread qui bloque l'appli (lecture port COM)

el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 - 4 août 2005 à 11:18
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 - 29 déc. 2005 à 12:51
Slt,



voilà, je lance un thread qui lit ce qui arrive sur le port série.
L'instruction suivante boucle sur elle même tant que l'on ne recoit
rien :



retVal = ReadFile(_portHandle, buffer, 1, ref numBytesRead, IntPtr.Zero) ;

Dès que l'on recoit qqch, le thread en question passe à l'instruction suivante.



Mon problème se situe lorsque je veux fermer le port COM qui est en train d'être scanné,
je fais un .Abort() sur le thread, mais mon appli ne veut pas fermer le
port car le thread doit être bloqué sur l'instruction ReadFile(...).

Quand j'essaye de fermer le port lorsque je n'ai pas lancé le thread de lecture du port, aucun problème.



Comment faire pour arréter toute instruction en cours ou en attente d'un thread, pour pouvoir ensuite arréter ce thread ?

(le port COM ne veut pas être fermé même après l'arrêt du thread de
lecture, car une instruction est toujours en train d'accéder au port )


Vu qu'en fait, c'est comme un accès à un fichier, y'aurait pas un
flush() ou un truc dans le genre pour arréter tout accès en cours au
fichier ? pour pouvoir fermer le fichier ?

6 réponses

Dutoyiste Messages postés 12 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 4 août 2005 1
4 août 2005 à 16:43
si tu fais un truc du genre



//create an Serial Port object
SerialPort sp = new SerialPort ();

tu creés un thread qui lit tout le temps

myThread = new Thread(new ThreadStart(Functionread));

public void Functionread()
{
while (1)
{
string s = sp.ReadLine();
//traitement du résultat
}

puis tu kill le thread et tu fais sp.close();

ca marche pas ca ?



Si ya pas de solutions c'est qu'ya pas de problèmes!
1
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
4 août 2005 à 16:54
En fait, quand j'ai déboggé la fonction de lecture du port série, quand j'arrive sur l'instruction
retVal = ReadFile(_portHandle, buffer, 1, ref numBytesRead, IntPtr.Zero) ;

et que je fais F11 (instruction suivante), la
ligne jaune disparaît, le thread reste en attente de recevoir qqch sur
le port série, car jusque là le buffer de réception est vide.

Dès lors que je recois un octet, la ligne jaune réapparait instantanément l'instruction suivante qui est :

return _readData ? buffer[0] : (byte)0 ;



En gros, lorsque je kill le thread qui fait la lecture, et que je veux
ensuite ferme le port COM ouvert, l'instruction close(handle) reste
bloquée car le thread qui faisait la lecture était bloqué sur une
instruction qui accédait tout le temps à ce port en lecture, donc, le
close(handle) ne veut pas ferme le port puisque qqch essaye d'y accéder.



Comment je peux faire pour stopper tout accès au port avant de le fermer ?
1
cs_thebigboss Messages postés 216 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 12 avril 2017 2
7 déc. 2005 à 16:25
Salut,

je suis interressé par la liaison série et il semble que tu l'utilises sans probleme. Pourrais-tu m'envoyer les fonctions que tu utilises pour mettre en oeuvre la laison RS232?

merci d'avance.

Nico
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
7 déc. 2005 à 19:10
Salut,



je pense que tu pourras trouver tout ça dans une de mes sources : tchat bluetooth.



Les fonctions du port série sont : readfile, writefile, et createfile pour ouvrir la liaison avec le port série.

va voir là, et dis moi si ca te convient : http://www.csharpfr.com/code.aspx?ID=33082



Teed'
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
roolian Messages postés 1 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 29 décembre 2005
29 déc. 2005 à 09:32
Merci beaucoup pour ta source, ells est très intéressante.
J'ai bricolé un peu dessus et pour fermer correctement le port, j'ai peut-être trouvé la solution pour "stopper tout accès au port avant de le fermer "

- ajoute d'abord CancelIo dans ConnexionSerie.cs
[DllImport("kernel32.dll")]
internal static extern Boolean CancelIo(uint hFile);

- puis tu ajoutes l'instruction au début de ClosePort dans ConnexionSerie.cs
public void Close_Port()
{
CancelIo(_portHandle);
.......................
}

J'espère que c'est ça, sinon tiens moi au courant, merci encore.
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
29 déc. 2005 à 12:51
Salut, en fait, je crois que j'avais trouvé la solution, mais plus
moyen de remettre la main dessus. Il s'agit en fait d'une erreur dans
la doc de msdn. Eh oui, c'est une erreur dans la valeur d'une constante
de mémoire. Il faut mettre 0x8000000 à la place de 0x4000000 un truc
comme ça. Et après, on peut fermer le port série.
0
Rejoignez-nous