[c++ parallele] pb gestion de delai
Dernière réponse : dans Programmation
Voila je poste ici car je suis sur qu'il y a des chauds et je ne veut pas passer à l'ennemi
Depuis septembre je programme durant mon temps libre des compostants graphique en SDL.
J'ai entre faire une class boutton,menu deroulant, edit ...
J'utilise cette "bibliothèque" dans mon projet reseau dans lequel j'ai besoin d'un composant particulier.
Explication:
Le porjet consiste a créer un chat en reseau. L'utilisateur recoit une demande d'invitation qu'il peut accepter ou refuser.
Le probleme c'est quand il n'est pas devant son pc il ne fait rien. Je veut donc implementer un timeout, si l'utilisateur ne repond pas avant X secondes on repond par defaut "Absent". Ce timeout serait matérialiser par une barre d'avancement (genre les barre de telechargement ... )
Pour cela j'ai comencé à créer une class "delai"
Voici les variables et fonctions que j'ai besoin.
Le problême se situe au niveau du parallelisme. Le "compte a rebour" doit etre gere en parralle car le processus principal doit permettre a l'utilisateur de repondre par oui ou non.
int lancer(void):
fait un fork et lance ds le fils la fonction wait
void wait(void):
utilise des sleep() afin d'actualiser tte les x secondes la bare d'avancement et si le delai est atteint met le booleen fin a vrai et ce ferme (le processus fils)
int stopper():
stoppe le processus fils. Cette fonction est appeler quand l'utilisateur a fait un choix.
Passons au chose serieuse.
Voivi les trois procedures importante:
Vous l'aurez compris tous ceci ne fonctionne pas
Pour fonctionner le programme a besoin que les variables de la classe soit partager par les 2 processus ( a cause de la mise a jour du boolleen fin) mais je ne sais pas vraiment si c'est le cas.
Pour fermer le processus la seul methode que j'ai trouve c'est un kill ...
et sinon ben si vous avez des idee, peut etre que j'ai fait n'imp
Avec tous ca j'ai oublié de vous dire le probleme rencontre
Lorsque l'utilisateur repond je fait stopper le delai avec la fonction stoppe (en faite ca le kill quoi), il se retrouve alors affiche entre croche lorsque je fait un ps -aux. Ensuite tous fonctionne normalement
Le probleme c'est lorsque le edlai touche a sa fin et donc que le kill utilise est celui qui est dans wait(), la tous le programme se ferme tous simplement
Depuis septembre je programme durant mon temps libre des compostants graphique en SDL.
J'ai entre faire une class boutton,menu deroulant, edit ...
J'utilise cette "bibliothèque" dans mon projet reseau dans lequel j'ai besoin d'un composant particulier.
Explication:
Le porjet consiste a créer un chat en reseau. L'utilisateur recoit une demande d'invitation qu'il peut accepter ou refuser.
Le probleme c'est quand il n'est pas devant son pc il ne fait rien. Je veut donc implementer un timeout, si l'utilisateur ne repond pas avant X secondes on repond par defaut "Absent". Ce timeout serait matérialiser par une barre d'avancement (genre les barre de telechargement ... )
Pour cela j'ai comencé à créer une class "delai"
class delai
{
private:
int duree;
short x;
short y;
short nb_case;
Uint32 col_bordure;
Uint32 col_fond;
Uint32 col_bordure_case;
Uint32 col_fond_case;
bool *fin;
pid_t pid;
t_fenetre *fen;
void wait(void);
public:
delai(t_fenetre *fen2,short x2,short y2,int duree2,short nb_case2,Uint32 col_bordure2,Uint32 col_fond2,Uint32 col_bordure_case,Uint32 col_fond_case);
int lancer(void);
int lancer(int duree2);
int stopper(void);
bool est_fini(void);
};
Voici les variables et fonctions que j'ai besoin.
Le problême se situe au niveau du parallelisme. Le "compte a rebour" doit etre gere en parralle car le processus principal doit permettre a l'utilisateur de repondre par oui ou non.
int lancer(void):
fait un fork et lance ds le fils la fonction wait
void wait(void):
utilise des sleep() afin d'actualiser tte les x secondes la bare d'avancement et si le delai est atteint met le booleen fin a vrai et ce ferme (le processus fils)
int stopper():
stoppe le processus fils. Cette fonction est appeler quand l'utilisateur a fait un choix.
Passons au chose serieuse.
Voivi les trois procedures importante:
bool delai::est_fini(void)
{
printf("%d\n",*fin);
return *fin;
}
int delai::lancer(void)
{
printf("Lancer()\n");
fin=*false;
pid = fork ();
if (pid ==0 )
wait();
else if (pid > 0)
return 1;
else
{
printf("Lancer: erreur le processus n'a pu être créé\n");
return 0;
}
}
void delai::wait(void)
{
int temp=0;
int x2,y2;
int tour=0;
printf("### duree: %d nb_case: %d\n",duree,nb_case);
printf("### aff_case: %f\n",duree/nb_case);
int aff_case=(int)duree/nb_case;
trace_rectangle_plein(fen->surface,x,y,x+4+(nb_case*13),y+18,col_fond);
trace_rectangle(fen->surface,x,y,x+4+(nb_case*13),y+18,col_bordure);
SDL_Flip(fenetre_princ.surface);
y2=y+4;
while(temp<duree && !fin)
{
if(temp%(aff_case)==0)
{
x2=x+4+(tour*13);
trace_rectangle_plein(fen->surface,x2,y2,x2+10,y2+10,col_fond_case);
trace_rectangle(fen->surface,x2,y2,x2+10,y2+10,col_bordure_case);
SDL_Flip(fenetre_princ.surface);
tour++;
}
sleep(1);
temp++;
}
*fin=true;
int ppid = getpid();
kill(ppid,SIGKILL);
}
int delai::stopper(void)
{
fin=true;
kill(pid,SIGKILL);
}
Vous l'aurez compris tous ceci ne fonctionne pas
Pour fonctionner le programme a besoin que les variables de la classe soit partager par les 2 processus ( a cause de la mise a jour du boolleen fin) mais je ne sais pas vraiment si c'est le cas.
Pour fermer le processus la seul methode que j'ai trouve c'est un kill ...
et sinon ben si vous avez des idee, peut etre que j'ai fait n'imp
Avec tous ca j'ai oublié de vous dire le probleme rencontre
Lorsque l'utilisateur repond je fait stopper le delai avec la fonction stoppe (en faite ca le kill quoi), il se retrouve alors affiche entre croche lorsque je fait un ps -aux. Ensuite tous fonctionne normalement
Le probleme c'est lorsque le edlai touche a sa fin et donc que le kill utilise est celui qui est dans wait(), la tous le programme se ferme tous simplement
Autres pages sur : parallele gestion delai
Lassé par la pub ? Créez un compte
bon ok tous fonctionne, enfin presque
le timeout n'est pas prise en compte, le processus fils se termine bien mais le processus principal ne voi pas que le boolleen fin est mise a TRUE
Les 2 processus doivent utiliser des variables differents
J'ai teste en utilisant un pointeur pour le booleen
bool * fin
si j'affiche l'adresse du pointeur, ds les 2 processus j'ai le meme affichage mais pas le mm contenu ds *fin
J'ai mis a jour l'algo du premier post en ajoutant la fonction est_fini()
le timeout n'est pas prise en compte, le processus fils se termine bien mais le processus principal ne voi pas que le boolleen fin est mise a TRUE
Les 2 processus doivent utiliser des variables differents
J'ai teste en utilisant un pointeur pour le booleen
bool * fin
si j'affiche l'adresse du pointeur, ds les 2 processus j'ai le meme affichage mais pas le mm contenu ds *fin
J'ai mis a jour l'algo du premier post en ajoutant la fonction est_fini()
Yep ca fonctionne avec les thread
Vous pourrez remarquer que j'utilise directement le booleen "fin" pour arreter le thread en cour d'execution.
Vous pourrez remarquer que j'utilise directement le booleen "fin" pour arreter le thread en cour d'execution.
class delai
{
public:
int duree;
short x;
short y;
short nb_case;
Uint32 col_bordure;
Uint32 col_fond;
Uint32 col_bordure_case;
Uint32 col_fond_case;
bool fin;
pthread_t adr_thread;
t_fenetre *fen;
delai(t_fenetre *fen2,short x2,short y2,int duree2,short nb_case2,Uint32 col_bordure2,Uint32 col_fond2,Uint32 col_bordure_case,Uint32 col_fond_case);
int lancer(void);
int lancer(int duree2);
int stopper(void);
bool est_fini(void);
};
void *wait(void *del);
void *wait(void *del)
{
delai* del1=(delai *)del;
int x=del1->x;
int y=del1->y;
int nb_case=del1->nb_case;
int duree=del1->duree;
t_fenetre *fen=del1->fen;
Uint32 col_fond=del1->col_fond;
Uint32 col_bordure=del1->col_bordure;
Uint32 col_fond_case=del1->col_fond_case;
Uint32 col_bordure_case=del1->col_bordure_case;
int temp=0;
int x2,y2;
int tour=0;
int aff_case=(int)duree/nb_case;
trace_rectangle_plein(fen->surface,x,y,x+4+(nb_case*13),y+18,col_fond);
trace_rectangle(fen->surface,x,y,x+4+(nb_case*13),y+18,col_bordure);
SDL_Flip(fenetre_princ.surface);
y2=y+4;
while(temp<duree && !del1->fin)
{
if(temp%(aff_case)==0)
{
x2=x+4+(tour*13);
trace_rectangle_plein(fen->surface,x2,y2,x2+10,y2+10,col_fond_case);
trace_rectangle(fen->surface,x2,y2,x2+10,y2+10,col_bordure_case);
SDL_Flip(fenetre_princ.surface);
tour++;
}
sleep(1);
temp++;
}
del1->fin=true;
}
int delai::lancer(void)
{
fin=false;
if(pthread_create(&adr_thread,NULL,wait,(void *)this) !=0)
{
printf("Erreur de création de thread\n");
return 0;
}
return 1;
}
int delai::stopper(void)
{
fin =true;
}
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumPb communication port parallele sous vmware workstation 7
- benchmarkThread en parallele
- ForumBracket parallele
- benchmarkGestion
- ForumConversion parallele usb
- ForumComment reconnaitre un port parallele
- articlesAdaptateur parallele bluetooth
- ForumPort parallele xp
- ForumCommander le port parallele
- ForumPilotage port parallele
- Voir plus