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

Threads & Processus C++ Discussion :

délégation d'appel de fonction à un thread


Sujet :

Threads & Processus C++

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Points : 176
    Points
    176
    Par défaut délégation d'appel de fonction à un thread
    Bonjour à tous,

    je viens de me heurter à un problème dont les seules solutions que je vois sont absolument horribles au point de vue conception, c'est pour ça que je fais appel à votre aide .

    Comme indiqué dans le titre, je cherche à exécuter des fonctions depuis un thread, en les lançant depuis le thread principal. J'explique la nécessité de faire cela : je code un petit wrapper pour coder en Opengl en utilisant le fenêtrage et les événements SDL, du coup vu que je veux qu'on puisse faire du multi fenêtrage et du multi vue dans chaque fenêtre, j'ai besoin de créer mes fenêtres dans l'unique thread graphique qui tourne. Sauf que je dois pouvoir créer des fenêtres depuis le thread principal. Du coup je dois appeler quelque chose du genre graphicalThread.addWindow(...); et graphicalThread ajoute la fenêtre dans sa boucle run. Cela implique de sauvegarder les arguments lors de l'appel à la fonction addWindow de graphicalThread.
    C'est donc extrêmement laid, car je n'ai pas une seule fonction, mais une vingtaine, donc autant de "tuple" d'arguments à enregistrer.

    Voyez-vous une solution propre ?

    Edit : Evidemment, il faut que sitôt après avoir posté le message j'aie l'idée d'une solution qui me paraisse bien meilleure (je ne sais pas pourquoi écrire tuple m'a fait penser à ça), mais dites moi quand même ce que vous en pensez : lorsqu'on appelle addWindow, on ajoute une std::function f correspondant à la fonction qu'on souhaite appeler en lui bindant ses arguments, comme ça on n'a plus qu'à appeler f() dans l'update.

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Une simple std::deque<std::function<void()>> que tu remplis depuis n'importe quel thread, et que tu vide dans le thread principal doit faire l'affaire ?
    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
    #include <thread>
    #include <deque>
    #include <mutex>
     
    void addWindow(int, float) { }
    void addWindow(double) { }
     
    // second thread
    void work(std::mutex& mut, std::deque<std::function<void()>>& tasks) {
    	while(1) {
    		// [...]
    		{
    			std::lock_guard<std::mutex> lock(mut);
     
    			// quelques soit le nombre / type des arguments, c'est caché dans une lambda
    			tasks.emplace_back([]() { addWindow(1, 0.4f); });
     
    			// ou via std::bind, (cast pour choisir la bonne surcharge)
    			tasks.emplace_back(std::bind(static_cast<void(*)(double)>(addWindow), 2.0));
    		}
    	}
    }
     
    int main() {
    	// main thread
    	std::mutex mut;
    	std::deque<std::function<void()>> tasks;
     
    	std::thread t([&mut, &tasks]() { work(mut, tasks); });
    	while(1) {
    		// [...]
    		{
    			// on récupère les traitements à effectuer par le thread principal
    			std::lock_guard<std::mutex> lock(mut);
    			while(!tasks.empty()) {
    				tasks.front()();
    				tasks.pop_front();
    			}
    		}
    	}
    	t.join();
    	return 0;
    }
    En fonction de la durée des traitement, il est peut être préférable de ne pas garder le lock sur la deque pendant qu'ils sont effectués.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Points : 176
    Points
    176
    Par défaut
    Ouep, c'est sur quoi je m'étais orienté (même si j'avais préféré utiliser une liste). Je pense que je peux passer le sujet en résolu vu qu'il ne doit pas exister de solution plus propre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Thread qui appel une fonction ?
    Par gastoncs dans le forum VB.NET
    Réponses: 1
    Dernier message: 12/03/2015, 18h49
  2. appel de fonction en fin de thread
    Par programaniac dans le forum Windows Forms
    Réponses: 8
    Dernier message: 23/11/2008, 01h36
  3. Réponses: 6
    Dernier message: 30/09/2005, 00h53
  4. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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