daminou973
Messages postés12Date d'inscriptionsamedi 7 octobre 2006StatutMembreDernière intervention27 mai 2007
-
14 mai 2007 à 19:07
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014
-
18 mai 2007 à 09:54
Bonjour à tous
je faits actuellement un projet sur une simulation d'une centrale et je
m'occupe des charges qui repprésentent les consommateurs d'energies...
j'ai faits un dialog base en MFC avec Visual C++ avec un bouton "ouvrir profil" et "appliquer profil"
j'ai ausi créé un serveurTCP capable de répondre au clientTCP du superviseur quand il me demmande de délester ou le nombre de charge actuellement.
il marche bien mais renvoi le nombre de charge qu'il y a à la derniére plage du profil à chaque fois
j'aimerai que pendant que le programme tourne qu'il soit capable de répondre
Autre chose quand j'applique les charges, le programme se fige c'est à
dire qu'on ne peut plus intervenir dessus, c'est sans doute pour ca que
le serveur prend la derniere plage à chaque fois
J'ai penser à des threads, mais je ne saits pas trop comment on fait...
J'ai essayé un SetTimer mais rien à faire
Si vous avez une idée ou des connaisance sur les threads... merci
quand j'applique sur " appliquer profil" je ne peux plus bouger la
fenêtre et le serveur ne réppond qu'à la fin du cycle ainsi il renvoie
la derniére étape et pas l'étape en cours
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 14 mai 2007 à 20:27
Tu sembles avoir toutes les réponses a tes pbs. Mais tu devrais savoir que google est très fidèle :)
"C++ thread" et tu devrais avoir largement de quoi faire.
Mais sache quand meme que pour manipuler des threads et une gui, ya quelques précautions a prendre. En général, la gui interdit au thread de la modifier. Donc perso, je passe par un système de timer, qui fait que la gui se rafraichit toutes les 100ms par exemple. C'est à dire qu'elle va lire les données générées par les threads.
Enfin ca, c'est en ce qui concercne gtk, wxwidget, pour les MFC (je sais meme pas ce que c'est), j'imagine que ca doit fonctionner de la meme facon.
daminou973
Messages postés12Date d'inscriptionsamedi 7 octobre 2006StatutMembreDernière intervention27 mai 2007 15 mai 2007 à 00:11
Merci luthor j'ai trouvé des exemples interessants concernant les
thread mais ca va m'embistrouillé, autant utilisé un timer je pense.
En fait je me suis peut être mal exprimé, voici la boucle de mon code qui merdouille :
// avant je récupére l'étape( i ) de l'heure actuele
// j'applique les charges jusqu'à la derniere etape
// fait partie du code du bouton "appliquer profil" for( i; i<= (taille/5)-1; i++)
// pour chaque etape du profil on
applique les charge
{
int
heurerecup=tabetape[i].DonneTonhd();
int
minuterecup=tabetape[i].DonneTamd();
int
hfrecup=tabetape[i].DonneTonhf();
int
mfrecup=tabetape[i].DonneTamf();
Etape.PrendPourhd(heurerecup);
Etape.PrendPourmd(minuterecup);
Etape.PrendPourhf(hfrecup);
Etape.PrendPourmf(mfrecup);
// on recuperele nombre de charge correspondant a l'etape actuelle
int
chrgerecup=tabetape[i].DonneCharges();
Etape.PrendPourchrgesRecuperees(chrgerecup);
applique_les_charges();
// je trace le profil pas à pas qui suit la courbe théorique si il n'y a pas de délestage
tracecourbeactuelle();
// SetTimer(1,2000,NULL); // timer mais ca marche encore moins!
}
le probléme déja ca merdouille au niveau de tracecourbeactuelle();
ca me trace bien la courbe qui recouvre la théorique mais quand le
profil est terminé,alors que je veux que ca trace au fur et a mesure
des étapes surrement parceque je suis dans une boucle.
cependant j'ai mis un sleep de 2s aprés avoir appliquer les charges puisque c'est une simulation :
je ne vois pas du tout comment faire même avec un timer, je vois pas pour faire pété la boucle, faut dire que je n'ai jamais utiliser de timer, j'ai créé le onwmtimer:
, si je comprend bien on mé le code dedans et quand on veut l'appeler on fait un truc du genre SetTimer(1,2000,NULL);
puis ya aussi le killtimer dés que l'on veut que ca s'arréte mais je
comprends pas ca foirre lol : ca me trace que la derniere etape avec le
timer!!
en fait ca applique les charges normalement mais ca ne trace pas la
courbe au fur et à mesure! Puisque le systéme est apparemment bloquant(
impossible de bouger la fenêtre tant que le profil n'est pas finis) à
cause de la boucle.
Pour le serveur ca sera good si je me débloque de la puisque j'utilise
un serveur asynchrone avec 2 classe CSocketecoute et CSocketdialogue
héritant de CSocket.
int chrgerecup= p->Etape.DonneChargesRecuperees();
if(chrgerecup==1)
{
theApp.charge->CommuteCharge('1');
p->Etape.PrendPourchrge(chrgerecup);
Sleep(2000);
}
...
}
HANDLE hThread = CreateThread(0, 0, (LPSTART_ROUTINE)applique_les_charges, this, 0); //Pardon mais suis un peu rouillé le code n'est pas exact
Tu dois reçevoir un pointeur vers la classe que tu veux en paramètre de la fonction qui démarre ton thread car on ne peut pas démarrer un thread àpartir d'une fonction appartenant à une classe.
Mais tu devras lire à propos des Mutex et Event pour synchroniser les threads car si jamais ton GUI va lire dans un emplacement qui n'existe plus (par exemple mémoire désalloué par le thread) tu va obtenir un crash légendaire.
La méthode que tu donne est exactement la même que celle que j'avais en haut, il envoie un pointeur en utilisant this a la fonction du thread. La seule difficulté possible c'est de créer la fonction qui va démarrer avec createthread.