begin process at 2012 05 29 10:50:48
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

MFC

 > 

effectuer 2 choses en même temps


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

effectuer 2 choses en même temps

lundi 14 mai 2007 à 19:07:37 | effectuer 2 choses en même temps

daminou973

Membre Club
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

Voici un récapitulatif en image:
1ere étape: ouverture du profil
[ Lien ]

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

si vous avez des suggestions
Merci



lundi 14 mai 2007 à 20:27:15 | Re : effectuer 2 choses en même temps

luhtor

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.
mardi 15 mai 2007 à 00:11:58 | Re : effectuer 2 choses en même temps

daminou973

Membre Club
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 :
void CProfil_automatiqueDlg::applique_les_charges()
        {
   
    int chrgerecup=Etape.DonneChargesRecuperees();
if(chrgerecup==1)
                {
                theApp.charge->CommuteCharge('1');
                Etape.PrendPourchrge(chrgerecup);

                Sleep(2000);

                }
...
}

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:
void CProfil_automatiqueDlg::OnTimer(UINT nIDEvent)
{
// code
CDialog::OnTimer(nIDEvent);
}
, 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.

Si quelqu'un a une idée ... Merci



mardi 15 mai 2007 à 08:46:28 | Re : effectuer 2 choses en même temps

max12

Administrateur CodeS-SourceS

Thread pour opération qui bloque, tu n'as pas tellement le choix tu peux faire quelque chose dans le genre :

void applique_les_charges(CProfil_automatiqueDlg* p)
        {
   
    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.

A+ Bon courage

[ Lien ]

mardi 15 mai 2007 à 18:31:28 | Re : effectuer 2 choses en même temps

daminou973

Membre Club
merci mais j'ai des problémes lors de la compilation :

LPSTART_ROUTINE' : undeclared identifier
autre chose, ça je le déclare en global ?
HANDLE hThread = CreateThread(0, 0(LPSTART_ROUTINE)applique_les_charges, this, 0)



mardi 15 mai 2007 à 18:43:38 | Re : effectuer 2 choses en même temps

daminou973

Membre Club
peut etre avec une classe comme ca :
class thread
{
public:
thread();
~thread();
virtual void run() = 0;
bool start();
static DWORD CALLBACK threadproc(LPVOID param);
HANDLE handle_value;
};

DWORD thread::threadproc(LPVOID param)
{
thread* pth = (thread*) param;

if(pth)
pth->run();

return 0;
}

bool thread::start()
{
DWORD id;

handle_value = CreateThread(NULL,0,thread::threadproc,this,0,&id);

return handle_value != NULL;
}

mais je ne vois pas comment l'utiliser pour mon programme

vendredi 18 mai 2007 à 09:54:41 | Re : effectuer 2 choses en même temps

max12

Administrateur CodeS-SourceS
[ Lien ]

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.

http://laptopgun.blogspot.com/
<


Cette discussion est classée dans : temps, étape, choses, profil, effectuer


Répondre à ce message

Sujets en rapport avec ce message

comment faire des calculs et dessiner en meme temps avec GLUT [ par nabil ] SALUT,j'ai le probleme suivant : je veux lire des coordonnées des points qui se trouve dans fichier et de faire un petit calcul et d'afficher des poin Calcul du temps de chargement d'un prog... [ par MorZong ] Salut,Encore moi, je suis partout, là c'est pour me dire comment faire pour calculer le temps (en millisecondes si c'est possible) qu'a prit un progr Comment savoir le temps que prend un instruction? [ par Samoul ] Je voudrait savoir comment calculer a l'aide d'un chronomètre ou de nimporte quel autres manière le temps qye peut prendre un instruction.Ex:Timer sta MFC : marche pas tout le temps. [ par jefk ] Voila, j'ai un pbm zarbi. J'ai fait une application SDI bidon sous visual studio avec le wizzard MFC.Ya deux menus, chacun a un sous menu qui fait apa Comment effectuer une liaison serie en c++ ??? [ par Arcocide ] Voila mon prob : je dois effectuer un liaison serie en c++ avec Builder enter un PC et une machine. Comment definir le port, et comment envoyer une li Problème incompréhensible [ par JosueClement ] Regardez plutot...Ce programme est une sorte d'horloge!Il n'y a aucune erreur de compilation, mais les heures n'augmentent jamais!!A la ligne 54, j'ai bomberman avec turbo c++ [ par xav42 ] Bonjour, je suis étudiant et à mon iut on utilise turbo c++ qui date un peumais bon...Voici mon probleme :j'ai un projet pour la fin de l'annee: fair bomberman avec turbo c++ [ par xav42 ] Bonjour, je suis étudiant et à mon iut on utilise turbo c++ qui date un peumais bon...Voici mon probleme :j'ai un projet pour la fin de l'annee: fair fenetre jaune [ par Xs ] Salut !j'ai beau chercher dans toutes les API que je connaisse ou pas, je ne trouve comment faire pour lorsque,la souris reste un certain temps sur un C++ :J'ai cherché partout, VOUS ETES MON SEULE ESPOIR! Même mes profs n'y connaissent rien... [ par Amidala ] Ca fait des journées que j'y bosse, je cherche à trouver l'équivalent de la fonction "Sleep" ou "Wait" en Visual C++ 6.0. (introuvable dans la catégor


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,669 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales