2010-05-06 6 views
1

Je cherche à trouver comment mettre en œuvre ce scénario: J'ai le code logique qui est à l'intérieur fonction, maintenant j'aime être en mesure d'exécuter cette fonction dans un thread séparé. maintenant ce que j'ai est une implémentation brute de cela .. I simple Init le Thread que dans sa méthode Start/Run je garde la logique de la fonction. comment puis-je le rendre plus générique? donc je pourrais envoyer la fonction (peut-être le pointeur de fonction) à l'usine générique de fil/piscine? en C++C++: détournant les yeux pour mettre en œuvre ce scénario

+2

Vous pourriez vouloir décomposer ceci en phrases et paragraphes. C'est illisible. – sbi

+0

Seriez-vous assez aimable pour ajouter quelques sauts de ligne à votre question? Je trouve très difficile à lire/comprendre – sum1stolemyname

+0

bien que j'essaie de .. mais sans serrure .. quel est le truc ici? – user63898

Répondre

3

Ceci est le schéma de commande. La solution habituelle consiste à regrouper la logique dans un objet de fonction:

class DoSomething { 
public: 
    // Constructor accepts and stores parameters to be used 
    // by the code itself. 
    DoSomething(int i, std::string s) 
     : i_(i), s_(s) { } 

    void operator()() { 
     // Do the work here, using i_ and s_ 
    } 

private: 
    int i_; 
    std::string s_; 
}; 
0

Jetez un oeil à boost :: fil et boost :: bind car ceux-ci deviendra le std :: tr1 :: fil et std :: tr1 ::lier.

boost :: thread est un petit objet, recevant un pointeur foncteur sans valeur de retour et aucun argument. Cela signifie soit un pointeur vers une fonction déclarée void (*function)(void);, soit une structure/classe implémentant void operator()().

Si vous utilisez également boost :: bind, vous pouvez adapter fondamentalement tout foncteur d'être appelé comme void (*functor)(void).

C'est aussi flexible que possible (car vous pouvez transformer n'importe quel objet fonctionnel ou de type fonction à appeler sans paramètre, puis le lancer dans son propre thread).

Questions connexes