donc j'ai une thread qui execute le code entry et mon prog principal qui
appel stop a un certain moment.
concernant le thread :
fd est le file descriptor d'un port serie.
fdToQuit est le file descriptor en lecture d'un PIPE
ce pipe sert a sortir de la fonction select (qui est/est doit
etre bloquante), tout ecriture dans le pipe devrait
reveiller le select (en theorie).
concernant InternalReceiver::stop:
ecrit juste dans le pipe;
ce code marche bien a condition de ne pas recevoir de caractere sur le
port serie (donc fd dans mon cas)
si je recois des caracteres sur le port serie alors toute ecriture sur
mon pipe n'est pas vu pas select !! et c'est la mon probleme !!
si quelqu'un a une idee, je suis preneur !
au passage si fdToQuit n'est plus un pipe mais un fichier alors select
n'est jamais bloquant et je rentre toujours dans
'if(FD_ISSET(fdToQuit,&rfds))', pourkoi ?
il me semble avoir lu un truc comme koi le caractere EOF rend select non
bloquant! - comment passer outre ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
ludonews
lud42fr wrote:
bonjour, j'ai un probleme avec select, [snip]
si je recois des caracteres sur le port serie alors toute ecriture sur mon pipe n'est pas vu pas select !! et c'est la mon probleme !! si quelqu'un a une idee, je suis preneur ! Quel OS , Quel Architecture Hardware ?
-- http://perso.hirlimann.net/~ludo/blog/
lud42fr <lud42fr@_noSPAM_wanadoo.fr> wrote:
bonjour,
j'ai un probleme avec select,
[snip]
si je recois des caracteres sur le port serie alors toute ecriture sur
mon pipe n'est pas vu pas select !! et c'est la mon probleme !!
si quelqu'un a une idee, je suis preneur !
Quel OS , Quel Architecture Hardware ?
si je recois des caracteres sur le port serie alors toute ecriture sur mon pipe n'est pas vu pas select !! et c'est la mon probleme !! si quelqu'un a une idee, je suis preneur ! Quel OS , Quel Architecture Hardware ?
-- http://perso.hirlimann.net/~ludo/blog/
maaxx
Salut,
Je pense qu'il te faudrait reinitialier ton masque rfds avant le select car il est modifie à chaque sortie de slect (la preuve tu le testes) Essaie: .............. while(1) { FD_ZERO(&rfds); FD_SET(fd, &rfds); FD_SET(fdToQuit, &rfds); int rs=select(maxForSelect+1,&rfds,NULL,NULL,NULL); .............................. M. "lud42fr" a écrit dans le message news: bk9ne8$fdd$
bonjour, j'ai un probleme avec select, je donne le code (c++) vite fait et je m'explique apres : [code]
void* InternalThread::Entry() { fd_set rfds; FD_ZERO(&rfds); FD_SET(fd, &rfds); FD_SET(fdToQuit, &rfds); iTRACE("--THREAD RUN--"); int maxForSelect; if(fd>fdToQuit) maxForSelectý; else maxForSelectýToQuit; while(1) { int rs=select(maxForSelect+1,&rfds,NULL,NULL,NULL); if(FD_ISSET(fdToQuit,&rfds)) { iTRACE("###############QUIT LA THREAD##############"); break; } if(FD_ISSET(fd,&rfds)) { //do something here !!! } } iTrace("THREAD QUIT"); }
donc j'ai une thread qui execute le code entry et mon prog principal qui appel stop a un certain moment.
concernant le thread : fd est le file descriptor d'un port serie. fdToQuit est le file descriptor en lecture d'un PIPE ce pipe sert a sortir de la fonction select (qui est/est doit etre bloquante), tout ecriture dans le pipe devrait reveiller le select (en theorie).
concernant InternalReceiver::stop: ecrit juste dans le pipe;
ce code marche bien a condition de ne pas recevoir de caractere sur le port serie (donc fd dans mon cas) si je recois des caracteres sur le port serie alors toute ecriture sur mon pipe n'est pas vu pas select !! et c'est la mon probleme !! si quelqu'un a une idee, je suis preneur !
au passage si fdToQuit n'est plus un pipe mais un fichier alors select n'est jamais bloquant et je rentre toujours dans 'if(FD_ISSET(fdToQuit,&rfds))', pourkoi ? il me semble avoir lu un truc comme koi le caractere EOF rend select non bloquant! - comment passer outre ?
merci ludo
Salut,
Je pense qu'il te faudrait reinitialier ton masque rfds avant le select car
il est modifie à chaque sortie de slect (la preuve tu le testes)
Essaie:
..............
while(1)
{
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
FD_SET(fdToQuit, &rfds);
int rs=select(maxForSelect+1,&rfds,NULL,NULL,NULL);
..............................
M.
"lud42fr" <lud42fr@_noSPAM_wanadoo.fr> a écrit dans le message news:
bk9ne8$fdd$1@news-reader1.wanadoo.fr...
bonjour,
j'ai un probleme avec select,
je donne le code (c++) vite fait et je m'explique apres :
[code]
void* InternalThread::Entry()
{
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
FD_SET(fdToQuit, &rfds);
iTRACE("--THREAD RUN--");
int maxForSelect;
if(fd>fdToQuit)
maxForSelectý;
else
maxForSelectýToQuit;
while(1)
{
int rs=select(maxForSelect+1,&rfds,NULL,NULL,NULL);
if(FD_ISSET(fdToQuit,&rfds))
{
iTRACE("###############QUIT LA THREAD##############");
break;
}
if(FD_ISSET(fd,&rfds))
{
//do something here !!!
}
}
iTrace("THREAD QUIT");
}
donc j'ai une thread qui execute le code entry et mon prog principal qui
appel stop a un certain moment.
concernant le thread :
fd est le file descriptor d'un port serie.
fdToQuit est le file descriptor en lecture d'un PIPE
ce pipe sert a sortir de la fonction select (qui est/est doit
etre bloquante), tout ecriture dans le pipe devrait
reveiller le select (en theorie).
concernant InternalReceiver::stop:
ecrit juste dans le pipe;
ce code marche bien a condition de ne pas recevoir de caractere sur le
port serie (donc fd dans mon cas)
si je recois des caracteres sur le port serie alors toute ecriture sur
mon pipe n'est pas vu pas select !! et c'est la mon probleme !!
si quelqu'un a une idee, je suis preneur !
au passage si fdToQuit n'est plus un pipe mais un fichier alors select
n'est jamais bloquant et je rentre toujours dans
'if(FD_ISSET(fdToQuit,&rfds))', pourkoi ?
il me semble avoir lu un truc comme koi le caractere EOF rend select non
bloquant! - comment passer outre ?
Je pense qu'il te faudrait reinitialier ton masque rfds avant le select car il est modifie à chaque sortie de slect (la preuve tu le testes) Essaie: .............. while(1) { FD_ZERO(&rfds); FD_SET(fd, &rfds); FD_SET(fdToQuit, &rfds); int rs=select(maxForSelect+1,&rfds,NULL,NULL,NULL); .............................. M. "lud42fr" a écrit dans le message news: bk9ne8$fdd$
bonjour, j'ai un probleme avec select, je donne le code (c++) vite fait et je m'explique apres : [code]
void* InternalThread::Entry() { fd_set rfds; FD_ZERO(&rfds); FD_SET(fd, &rfds); FD_SET(fdToQuit, &rfds); iTRACE("--THREAD RUN--"); int maxForSelect; if(fd>fdToQuit) maxForSelectý; else maxForSelectýToQuit; while(1) { int rs=select(maxForSelect+1,&rfds,NULL,NULL,NULL); if(FD_ISSET(fdToQuit,&rfds)) { iTRACE("###############QUIT LA THREAD##############"); break; } if(FD_ISSET(fd,&rfds)) { //do something here !!! } } iTrace("THREAD QUIT"); }
donc j'ai une thread qui execute le code entry et mon prog principal qui appel stop a un certain moment.
concernant le thread : fd est le file descriptor d'un port serie. fdToQuit est le file descriptor en lecture d'un PIPE ce pipe sert a sortir de la fonction select (qui est/est doit etre bloquante), tout ecriture dans le pipe devrait reveiller le select (en theorie).
concernant InternalReceiver::stop: ecrit juste dans le pipe;
ce code marche bien a condition de ne pas recevoir de caractere sur le port serie (donc fd dans mon cas) si je recois des caracteres sur le port serie alors toute ecriture sur mon pipe n'est pas vu pas select !! et c'est la mon probleme !! si quelqu'un a une idee, je suis preneur !
au passage si fdToQuit n'est plus un pipe mais un fichier alors select n'est jamais bloquant et je rentre toujours dans 'if(FD_ISSET(fdToQuit,&rfds))', pourkoi ? il me semble avoir lu un truc comme koi le caractere EOF rend select non bloquant! - comment passer outre ?