begin process at 2012 05 28 22:50:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

MFC

 > 

controller l'execution d'une fonction


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

controller l'execution d'une fonction

dimanche 2 novembre 2008 à 03:12:59 | controller l'execution d'une fonction

ebrainis

Salut, je programme un interface graphique qui permette à un utilisateur de controler l'execution d'une fonction. Comme je suis débutant, j'ai trouvé plus facile d'utiliser les MFC plutot que les API. J'ai utilisé Visual studio pour m'aider à créer la fenetre principale et j'ai créé des menus. En particulier, un menu Run contenant les items : Start, Stop et Pause. Je voudrais que la fonction s'execute lorsque l'utilisateur clic sur Start, qu'elle se termine lorsqu'il appuye sur Stop et se suspende lorsqu'il appuye sur pause. Le soucis est que si je lance la fonction à partir de OnRunStart(), l'interface graphique est figé tant que la fonction ne se termine pas. (Dans mon cas, elle ne se termine jamais car elle contient une boucle.) Alors comment faire? En regardant un peu sur le forum, j'ai vu qu'on y parlait d'utiliser des threads, mais je ne sais pas trop ce que c'est, ni si cela s'applique à mon problème. (C'est mon premier programme pour Windows Javascript:Insert_Emoticon('/imgs2/smile_big.gif');) Si quelqu'un pouvait me suggérer quelques solutions, ce serait sympa.
dimanche 2 novembre 2008 à 10:15:04 | Re : controller l'execution d'une fonction

BruNews

Administrateur CodeS-SourceS
Un long traitement se fait dans un thread séparé pour ne pas bloquer l'interface graphique qui est dans ton thread primaire.

ciao...
BruNews, MVP VC++
dimanche 2 novembre 2008 à 11:18:15 | Re : controller l'execution d'une fonction

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Un code qui illustre ce principe, mais dans une appli console :
http://www.cppfrance.com/forum/sujet-ARRETER-BOUCLE-INFINI_996556.aspx?p=2
dimanche 2 novembre 2008 à 11:25:21 | Re : controller l'execution d'une fonction

BruNews

Administrateur CodeS-SourceS
Il doit chercher des exemples avec AfxBeginThread().
En utilisant directement l'API, il n'aurait aucun constructeur ni destructeur de classe appelé donc graves fuites de mémoire.

ciao...
BruNews, MVP VC++
lundi 3 novembre 2008 à 23:46:22 | Re : controller l'execution d'une fonction

ebrainis

Merci pour vos réponses. Je vais regarder de ce pas comment marchent les threads. Cela dit, j'ai entretemps imaginé une autre stratégie et je voudrais avoir votre avis là dessus. Au lieu de lancer ma fonction à partir de OnRunStart(), je n'utilise OnRunStart() que pour assigner une valeur arbitraire START à une variable m_run. Je passe ensuite cette variable à la fonction OnIdle() [membre de ma classe "Application"] et je lance ma fonction à partir de OnIdle() si m_run ==START. De cette manière ma fonction tourne en boucle tant qu'il n'y a pas de nouveaux messages (ce que je veux) et répond à chaque injonction Start, Stop ou Pause. Est-ce que cette solution est meilleure ou moins bonne que d'utiliser une nouvelle thread? Qu'en pensez-vous?
mardi 4 novembre 2008 à 09:04:12 | Re : controller l'execution d'une fonction

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !

Ce n'est pas parce qu'un message arrive que l'exécution de OnIdle va s'arrêter. Il faut donc que ce que tu mettes dans OnIdle soit relativement court.

mardi 4 novembre 2008 à 21:54:12 | Re : controller l'execution d'une fonction

ebrainis

Salut à tous, J'ai essayé les threads et ca marche très bien. Je lance la thread secondaire avec AfxBeginThread(), je mets l'application en pause avec SuspendThread() et la réactive avec ResumeThread(). Par contre, je le plus grand mal du monde à trouver une façon d'intérompre la thread. Pourquoi n'y a -t-il pas une gentille fonction qui fait ce boulot là ? (Enfin, autre que TerminateThread() car celle-là ne nettoie derrière elle). Qui sait comment faire cette opération ?
mercredi 5 novembre 2008 à 09:16:55 | Re : controller l'execution d'une fonction

rt15

Membre Club Administrateur CodeS-SourceS

Il n'y a pas de recette miracle. Il faut faire un teste régulièrement dans la routine du thread. Cela peut se faire via un évènement (Voir l'exemple de mon lien plus haut), ou simplement par une variable globale, passant de 0 à 1. Sachant que la variable en question n'est écrite que par le thread principal, il n'y a pas à s'embêter concernant la concurrence d'accès.

Tout le problème étant de tester très régulièrement si l'arrêt du thread a été demandé... Donc à chaque tour de boucle des principales boucles de la routine du thread par exemple :

// Premier traitmement
for (i = 0; i < n ; i++)
{
  // Traitement
  // Fin du thread demandé par le thread principal
}

// Deuxième traitement
while (une condition && fin du thread pas demandée)
{
  // Traitement
}

Une fois que le thread principal à demandé au thread secondaire de s'arrêter, en pur Win32, il faut que le thread principal attende que le thread secondaire s'arrête pour fermer proprement son handle sur le thread secondaire. Je ne sais pas comment cela doit se traduire en MFC, mais je serais surpris qu'il ne faille pas que le thread principal attende le thread secondaire.

mercredi 5 novembre 2008 à 17:30:46 | Re : controller l'execution d'une fonction

ebrainis

Je crois que je comprend le principe de l'arret par une variable ou un event (CEvent). C'est lorsque j'essaye de l'appliquer que ca foire.

La fonction que je veux executer dans un thread secondaire doit recevoir des parametres. Or ces parametres sont determines par l'utilisateur dans une boite de dialogue non modale. En clair, ces parametres sont des membres proteges d'une classe de dialogue. Avant que vous ne m'aiguiyiez vers les conditions d'arret, j'utilisais le pointeur pParam de AfxBeginThread(funcProc, pParam, ....) pour pointer vers ma classe de dialogue pour acceder a ces variables, mais maintenant je dois l'utiliser pour passer un 'event'. Du coup, je me suis dit pourquoi ne pas faire ma function funcProc membre de la classe de Dialogue. C'est meme plus logique. Mais la ca ne marche plus (erreurs de compilation). Voici comment mon code principal est structure:

Dans mon Document.cpp:

#include monDialog.cpp //De cette maniere j'ai les declarations et les definitions des fonctions

/// Plein de code .........

void CdmdControllerDoc::OnRunStart()
if ((m_Program !=NONE)&& (m_Run!=START))
{
m_Run=START;
//Create the thread (pDlg est un pointeur vers mon dialogue)
m_pWorkThread =AfxBeginThread(pDlg->funcProc, pParam,THREAD_PRIORITY_LOWEST); // pParam sera vraisemblablement un CEvent*
}

void CdmdControllerDoc::OnRunStart()
if ((m_Program !=NONE)&& (m_Run!=STOP)
   {
   m_Run=STOP;
   //Faire ce qui s'impose pour dire a la thread secondaire de se terminer
   }

void

CdmdControllerDoc::OnRunPause()
{
if (m_Run!=PAUSE)
   {   
      m_Run=PAUSE;
      m_pWorkThread->SuspendThread();
   }
else
   
{
      m_Run=START;
      m_pWorkThread->ResumeThread();
   }
}

 Dans mon monDialogue.cpp

// This is the function that implements the Test program
UINT CmonDialog::funcProc(LPVOID pParam)
{
_cprintf("I'm in Prog_Test");
int i=0;
for (i=0;i<1e5;i++)
{_cprintf("%d",i);
}
return 0;
}

Visual Studio me donne le message d'erreur

error C3867: 'CmonDialog::funcProc': function call missing argument list; use '&CmonDialog::funcProc' to create a pointer to member

Que faut-il faire dans ce cas la?

Quand j'aurai fini par faire marcher cette thread, il faudra que je poste un exemple car ca manque cruellement.

jeudi 6 novembre 2008 à 09:04:34 | Re : controller l'execution d'une fonction

rt15

Membre Club Administrateur CodeS-SourceS

'CmonDialog::funcProc': Appel de fonction sans liste d'argument. Utiliser '&CmonDialog::funcProc' pour créer un pointeur sur le membre.

Dans ton cas tu veux effectivement un pointeur sur le membre :

m_pWorkThread =AfxBeginThread(&CmonDialog::funcProc, pParam,THREAD_PRIORITY_LOWEST);


1 2

Cette discussion est classée dans : fonction, programme, execution, controller, termine


Répondre à ce message

Sujets en rapport avec ce message

Fonction While multiple [ par oshin ] Salut tout le monde,J'ai un problème tout bête..Dans mon programme j'ai inclus une fonction "While(1)" donc infini.. le probleme c'est que lorsque le Execution d'un script BASH à partir d'un programme en C [ par GyOm2221 ] Bonjour, Le principal est dans le titre, je cherche à faire un système de client/serveur , la communication fonctionne, mais pas moyen d'executer un s j'applique ce programme mé ca fonction pa le problemes et tjrs au niveau de getch(); me donne erreur????????? [ par perledumaroc ] #include#includeint main(){    int x;    printf("entrer la valeur de x");    scanf("%d", & x);     x+=21;    printf("la valeur de x=%d",x);    getch fonction dans dll qui fait planter programme [ par pitch069 ] Bonjour,je travail actuellement sur un code C++, sous dev c++. j'utilise une dll au travers d'un *.lib et dans mon programme principal je fais appel a suppression des fichiers [ par boualiasma ] Bonjour, Je voulais supprimer totalement à partir de mon programme C sous windows tous les fichiers textes temporaires dans mon répertoire de travail Problème à l'execution [ par echec ] Bonjour,J'ai pris il n'y a pas longtemps un programme c++, recréant le principe du jeu des chiffes et des lettres. Lorsque je le compile, je n'ai aucu fichier généré lors de l'execution d'un programme [ par lilly91 ] Bonjour,Dans le cadre de mon stage, j'aimerais savoir qu'elles sont les fichiers généré en règle générale lors de l'éxécution d'un programme, qu'elles Définir un point d'entrée [ par Havy ] Bonjour, sachant que tout programme console doit contenir la fonction main pour fonctionner, car c'est le point d'entrée, je voudrais savoir s'il est Thread ? [ par galax98 ] Bonjour Une petite question sans doute basique mais je n'arrive pas à m'en sortir. J'ai développé une application Windows sous dev-cpp, avec notamment


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 : 0,515 sec (3)

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