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

VC++ .NET Discussion :

thread et progressBar sous Visual C++


Sujet :

VC++ .NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Par défaut thread et progressBar sous Visual C++
    Bonjour à tous

    J'essaie de m'entrainer u peu à l'utilisation des thread avec Visual C++ et je cherche à commencer par quelque chose d'à priori simple: modifier l'avancement d'une progresse barre.
    En gros je veux faire en sorte que ma progresse barre passe de 0 à 100% en 10 secondes et à la fin de ces 10 secondes je fais un autre traitement.
    J'ai déja fait des thread similaire en Java mais la syntaxe du C++ et plus particulièrement avec Visual me pause des problèmes.
    Je pense que c'est un problème tellement banal que la solution doit être bien connue et pourtant je ne trouve rien de concret en C++.

    Quelqu'un a t'il une idée ?

    En gros je veux que mon thread fasse appelle a un code de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i = 0; i<=100; i++)
    {	
    	this->progressBar1->Value=i;
            Sleep(100);  // connait pas l'équivalent C++ de cette fonction
    }
    Je suppose que mon thread doit au moins prendre en paramètre l'objet progressBar qui doit être incrémenté.

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Par défaut
    J'essaie de partir de quelque chose de plus simple:

    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
     
    Le fichier qui fait office de main:
    ################################
     
    // STR_Project.cpp : fichier projet principal.
     
    #include "stdafx.h"
    #include "Form1.h"
     
    using namespace STR_Project;
     
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
        BaseTerre terre;
        Sonde sonde;
     
        pthread_t thread_terre;
        pthread_t thread_sonde;
     
        pthread_attr_t pattr1;
        pthread_attr_t pattr2;
     
        int a = pthread_create(&thread_terre, &pattr1, BaseTerre::run, &terre);
        int b = pthread_create(&thread_sonde, &pattr2, Sonde::run, &sonde);
     
        return 0;
    }
    #############################
     
    Ma classe BaseTerre:
    #############################
    void BaseTerre::run(void* param)
    {
        ((BaseTerre *)param)->work();  
    }
     
    void BaseTerre::work()
    {
        cout<<"base"<<endl;
    }
    #############################
     
    Ma classe Sonde
    #############################
    void Sonde::run(void* param)
    {
        ((Sonde *)param)->work();
    }
     
    void Sonde::work()
    {
        cout<<"sonde"<<endl;
    }
    ###########################
    Je reprécise que je développe sous window avec Visual studio 2005 C++, j'ai inclut la librairie pthread dans mon projet.

    Voici l'erreur que j'obtiens pourles 2 create_threads:
    Erreur 1 error C2664: 'pthread_create' : impossible de convertir le paramètre 3 de 'void (__clrcall *)(void *)' en 'void *(__clrcall *)(void *)'

    Qu'est ce qui ne va pas ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Attends, tu mélanges pthread et .Net ?

    Déjà que je déconseillerais d'utiliser les fonctions de multithreading natif de l'API Windows dans un programme en C++/CLI, je déconseille encore plus d'y utiliser pthread.

    Si tu programmes en .Net, utilise plutôt les fonctions de multithreading de .Net (classe System::Threading::Thread et Cie).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Par défaut
    A la base j'ai créé une application formulaire en C++, je ne comprend déjà pas pourquoi Visual me fait des chose en .Net

    Ensuite je voulais utiliser pthread pour ne pas trop dépayser les personnes qui vont relire mon code derrière moi.

    Je me suis rendu compte que je n'avais pas correctement linker la librairie.
    Maintenant je n'ai plus de message d'erreur mais ça plante....
    J'ai modifié un peu le main

    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    // STR_Project.cpp*: fichier projet principal.
     
    #include "stdafx.h"
    #include "Form1.h"
     
    using namespace STR_Project;
    static void* showForm(void* param)
    {
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    	Application::Run(gcnew Form1());
    	return NULL;
    }
     
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	BaseTerre terre;
    	Sonde sonde;
     
    	pthread_t thread_terre;
    	pthread_t thread_sonde;
    	pthread_t thread_form;
     
     
    	int a = pthread_create(&thread_terre, NULL, BaseTerre::run, &terre);
    	int b = pthread_create(&thread_sonde, NULL, Sonde::run, &sonde);
    	int x = pthread_create(&thread_form, NULL, showForm, NULL);
     
    	return 0;
    }
    Si je voulais utiliser les thread de .net comment faudrait il que je m'y prenne ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Citation Envoyé par goingoin Voir le message
    A la base j'ai créé une application formulaire en C++, je ne comprend déjà pas pourquoi Visual me fait des chose en .Net
    Parce que les "Formulaires" ("Windows Forms"), c'est du .Net.

    Quant au multithreading .Net, je ne sais pas trop, je ne l'ai jamais utilisé en C++/CLI. Pour .Net, je suis plutôt du genre à programmer en C#, donc il faudra attendre l'arrivée ici d'un type plus calé que moi.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Par défaut
    J'ai suivi un tuto qui explique comment faire des threads selon la methode VC.
    ça marche déjà mieux mais j'essaie d'accéder par l'intermédiaire de mon thread à un objet qui a été instancié par un autre.
    Opération inter-threads non valide*: le contrôle 'progressBar1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

    Comment faire pour qu'un thread interagisse avec un élément qu'il n'a pas lui même instancié ?

Discussions similaires

  1. [MSChart] creation de courbe sous visual C++
    Par gabriel knight dans le forum MFC
    Réponses: 5
    Dernier message: 18/09/2006, 14h32
  2. Impression sous visual c++
    Par zeze511 dans le forum MFC
    Réponses: 2
    Dernier message: 16/02/2004, 12h02
  3. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 19h52
  4. Réponses: 3
    Dernier message: 28/01/2004, 10h46
  5. Deplacer un curseur dans un RichEdit sous visual c
    Par tweek dans le forum Windows
    Réponses: 7
    Dernier message: 14/01/2004, 00h29

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