IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Threading ou pas threading?si oui, comment?


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut Threading ou pas threading?si oui, comment?
    Bonjour,

    Je suis en train d'écrire un programme ( j'en suis aux finitions ) avec des WIN API

    Dans une de mes boites de dialogue, je lance l''exécution de ma fonction principale ( analyse du contenu de quelques fichiers . txt)

    J'aimerais pendant l'analyse, tenir au courant l'utilisateur , de l'état d'avancement des choses... par exemple affichage dans une list box du nom du fichier qui est traité, et dire "traité!" quand il est traité

    Il me semble que pour cela l'utilisation de threads serait opportune, mais bon.. ça me parait un peu bp compliqué, .. alors si vous avez un super exemple qui permet de super bien comprendre je suis preneuse, ou d'autres idées pour répondre à mes attentes!

    Merci par avance.

    Anna

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    En fait, tu as deux choix selon moi: Soit utiliser le multithreading, soit inclure une boucle de messages non-bloquante dans ton traitement (une boucle avec PeekMessage() au lieu de GetMessage()).

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    Je vais sans doute paraitre un peu bete... mais ce n'est la que le fruit de mon ignorance mouhaha je suis en verve aujourdh'ui...

    Comment faire un PeekMessage et SendMessage quand je dialogue avec des .h

    Je vais tenter de mieux m'expliquer..

    J'ai un .cpp qui contient mon programme principal qui lance mes boites de dialogue et les lie.
    Des .h qui : crées un graphique, fais l'analyse de mes résultats, contient mes parametres, fais l'ouverture d'un fichier...

    Dans analyse.h j'analyse plusieurs fichiers texte, dont je récupere les noms dans un char... j'aimerais au cours de l'analyse afficher dans une boite de dialogue -qui est dans mon main.cpp - l'avancée de l'analyse, donc afficher le fichier traité en cours....

    un peu ambitieuse peut etre?

    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Qu'est-ce que c'est que cette histoire de code dans des .h ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    pas taper sur les fesses ca fait mal lol

    Ben normal... il y a des fonctions que je n'ai pas a mettre dans mon code principal contenant mes boites de dialogue, donc j'appelle des .h tu veux que je te mettes en lien ce que j'ai fait pour que tu vois ce que je veux dire? parceque peut etre que je m'exprime mal.. si je dis que dans mon cpp j'appelle des .h dans lesquels j'ai mis des fonctions c'est mieux? si oui c'est quoi la reponse a mon probleme?




  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Les fonctions, tu les mets forcément dans des .c ou des .cpp.
    Seule leur déclaration doit aller dans des .h

    Note: Exception faite des fonctions template et inline, bien entendu.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    euh desolée de ne pas avoir le language approprié

    tu veux dire que dans mes .h j'ecris :

    void fonction()
    {
    bla blabla;
    blablabalba;
    ......
    blablabla;
    }

    et que dans mes .cpp j'ecris:
    fonction();

    pour les appeler..

    ?? lol si je traduis en language non programmateur?

    si oui que dois je faire concernant ma question?

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Tu fais ce qu'il ne faut pas faire.

    Pour utiliser des fonctions communes, tu dois faire ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* fonctionsCommunes.c */
     
    void fonction(void)
    {
    	bla blabla;
    	blablabalba;
    	......
    	blablabla;
    }
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* fonctionsCommunes.h */
     
    void fonction(void);
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* main.c */
    #include "fonctionsCommunes.h"
     
    int main(void)
    {
    	fonction();
    	return 0;
    }

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ensuite, pour ta fonction longue, je t'ai répondu : Ta fonction principale peut tout-à-fait appeler des fonctions comme SetWindowText() etc. pour ta boîte de dialogue, ou faire des SendMessage().

    Par contre, ta fonction doit contenir des "sous-boucles" de message pour éviter que ton application n'apparaisse "bloquée". Et ta boîte de dialogue doit refuser de faire certaines choses quand ta fonction longue est en cours:
    • Refuser de quitter en interceptant le message WM_CLOSE
    • Refuser de relancer la fonction tant qu'elle n'est pas terminée
    • etc.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    le void entre parenthese a quelle signification?

    Donc si je comprend ce que tu me dis:

    pour chaque sous-fonction je crée un .cpp

    puis je crée un .h dans lequel je fais des appels pour toutes mes sous-fonctions et un autre .h pour mes parametres ( ou dans le meme d'ailleurs...)

    et quand je veux appeler une fonction dans mon main c'est tjs pareil...

    juste?

    Ensuite, pour ta fonction longue, je t'ai répondu : Ta fonction principale peut tout-à-fait appeler des fonctions comme SetWindowText() etc. pour ta boîte de dialogue, ou faire des SendMessage().

    Par contre, ta fonction doit contenir des "sous-boucles" de message pour éviter que ton application n'apparaisse "bloquée". Et ta boîte de dialogue doit refuser de faire certaines choses quand ta fonction longue est en cours:
    Refuser de quitter en interceptant le message WM_CLOSE
    Refuser de relancer la fonction tant qu'elle n'est pas terminée
    etc.
    Euhhh oui, mais c'est dans une sous fonction que je veux recuperer un char... et l'afficher dans une fenetre qui est dans ma boite principale... et je ne peux pas faire un return sinon ca arrete ma boucle de traitements de fichiers...


  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Citation Envoyé par nanettemontp Voir le message
    pour chaque sous-fonction je crée un .cpp
    Pas forcément pour chaque sous-fonction... Tu peux toujours regroupper des fonctions dans le même fichier source C++...


    Euhhh oui, mais c'est dans une sous fonction que je veux recuperer un char... et l'afficher dans une fenetre qui est dans ma boite principale... et je ne peux pas faire un return sinon ca arrete ma boucle de traitements de fichiers...
    1. Ce n'est pas un simple char à mon avis, mais une chaîne (un tableau de char terminé par un caractère nul)...
    2. Qui a parlé de return ici ?
    3. Pour les return, voir l'autre thread.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    Certes...ici on n'a pas parlé de thread mais moi j'en parlais parceque je ne connais pas autre chose..

    Donc si maintenant l'analyse de mes erreurs en matiere d'expression dans le domaine informatique est terminé... serait il possible de m'aider?

    Désolée comme je le répete je fais comme "je peux" certes je ne suis pas "parfaite" loin de la... je tente de me debrouiller ici pour expliauer mes problemes en matiere de programmation et obtenir des pistes, de l'aide...

    On a tous été débutants et pas forcément tous doués au début..


    Merci par avance a ceux qui voudront bien me comprendre malgres mon vocabulaire non parfait techniquement...

    et je me repete: le void entre parentheses dans void fonction(void) a quelle signification?
    Bonne journée

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ta fonction qui modifie la listbox au fur et à mesure:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void FonctionLongue(HWND hList)
    {
    	for( ... )
    	{
    		SendMessage(hList, LB_ADDSTRING, etc.);
    	}
    }
    Jusqu'ici, ce n'est pas compliqué, si ?

    Ensuite, la sous-boucle de messages pour que le programme n'aie pas l'air "planté" :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //Une version simple, qui ignore les histoires de hook etc.
    void ViderFileMessages()
    {
    	MSG msg;
    	while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    		//Reposte les messages WM_QUIT et force à quitter la boucle
    		if(msg.message == WM_QUIT)
    		{
    			PostMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
    			break;
    		}
    	}
    }

    Et tu ajoutes un appel à ViderFileMessages() dans ta boucle, et miracle, le programme réagit pendant que la fonction travaille!

  14. #14
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    POur les fonctions communes, j'ai tenté d'appliquer ce que tu m'as dit mais j'ai:

    Main.cpp
    Analyse.cpp
    Ouverture.cpp
    Drawing.cpp

    Init.h ( Qui contient les parametres)

    Fonctions communes.h

    J'ai des parametres communs entre les fonctions...donc j'ai un soucis de redefinition de parametres si je mets un #include "Init.h" dans chaque .cpp...

  15. #15
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ta fonction qui modifie la listbox au fur et à mesure:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void FonctionLongue(HWND hList)
    {
    	for( ... )
    	{
    		SendMessage(hList, LB_ADDSTRING, etc.);
    	}
    }
    Jusqu'ici, ce n'est pas compliqué, si ?
    Euh ben pour toi , vu que tu vois de quoi tu parles c'est evident... mais la comme ca je ne vois pas du tout ce que je dois mettre dans SendMessage, et a quoi correspond LB_ADDSTRING ...

    Citation Envoyé par Médinoc Voir le message
    Ensuite, la sous-boucle de messages pour que le programme n'aie pas l'air "planté" :

    Et tu ajoutes un appel à ViderFileMessages() dans ta boucle, et miracle, le programme réagit pendant que la fonction travaille!
    Quand tu parles de ma boucle... tu parles de la boucle dans la fonction longue je suppose... non?

    Merci pour tout en tout cas..

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    J'ai des parametres communs entre les fonctions...donc j'ai un soucis de redefinition de parametres si je mets un #include "Init.h" dans chaque .cpp...
    ?!?!?
    Qu'est-ce que tu veux dire ?? Multiple définition de variables globales ?
    Euh ben pour toi , vu que tu vois de quoi tu parles c'est evident... mais la comme ca je ne vois pas du tout ce que je dois mettre dans SendMessage, et a quoi correspond LB_ADDSTRING ...
    Ne m'avais-tu pas dit que tu utilisais une listbox ?
    Quand tu parles de ma boucle... tu parles de la boucle dans la fonction longue je suppose... non?
    Oui.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    ?!?!?
    Qu'est-ce que tu veux dire ?? Multiple définition de variables globales ?
    Oui je crois

    Citation Envoyé par Médinoc Voir le message
    ?!?!?
    Ne m'avais-tu pas dit que tu utilisais une listbox ?

    Si si ... mais comment je dis que je l'associe a la bonne list box, et ou est ce que je dis que je veux un certain texte dans la fonction SendMessage dans ce cas?

    Je suppose vu ta reponse que LB_ADDSTRING est une fonction propre aux listes box.... je vais aller voir la msdn...et je re avec mes questions


    edit:

    humm donc apres avoir consulte la msdn...


    SendMessage(hList, LB_ADDSTRING, etc.);

    serait donc dans mon cas:

    SendMessage(hList, LB_ADDSTRING, buffer,NULL); ????

    mais buffer dans mon cas n'est pas un string mais un char*...

    et je suppose que pour associer a la bonne listbox.. il me faut simplement dans ma fonction principale dire que hList correspond au HWND d'une de mes boites de dialogue...

  18. #18
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    Hello, concernant la sous-boucle ( parmis les choses a resoudre dans ce post..)

    Je la mets dans ma boucle while... donc effectivement je n'ai pas de "freeze" de la fenetre, mais si je clique sur quitter ... je quitte effectivement ma boite de dialogue, mais le traitement de mes données continue...

    Toujour en suspens la question des .h, .cpp et leur utilisation avec variables globales

    bonne journée a vous!

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    En effet, ajouter la sous-boucle ajoute ce risque, c'est pourquoi il est temps de passer à l'étape suivante:
    Refuser de quitter pendant une opération longue.
    Et pour ça, tu ajoutes un flag en mémoire, que tu mets à 1 quand tu commences une opération longue et à zéro quand tu la finis (car je suppose que tu n'acceptes pas deux opérations longues simultanées), et quand le flag est à 1, tu interceptes le message WM_CLOSE...

  20. #20
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    183
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 183
    Points : 38
    Points
    38
    Par défaut
    euh... mais je veux quitter...

    Dans la boucle dans laquelle j'ai mis ViderMessage() j'analyse UN fichier parmis N.

    J'aimerais que quand je lui clique sur mon bouton "cancel" , certes que l'analyse de ce fichier se termine, mais que le reste des fichiers ne soit pas analysé..

    et les flags ? kesako ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Thread ou pas Thread
    Par jadey dans le forum Général Java
    Réponses: 13
    Dernier message: 22/02/2014, 01h38
  2. Thread ou pas Thread ?
    Par Franck.H dans le forum SDL
    Réponses: 8
    Dernier message: 04/12/2006, 22h10
  3. threads pas Thread ! (1 tte tite question)
    Par lagra3 dans le forum Langage
    Réponses: 3
    Dernier message: 11/08/2006, 13h28
  4. [blem C++ thread ou pas threads]
    Par fastzombi dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 29/10/2005, 00h09
  5. [THREAD][DAEMON]Pas bien compris....
    Par XristofGreek dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 24/09/2004, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo