2014-06-26 3 views
0

J'essaie de me souvenir du fonctionnement des threads, je vois qu'avec C++11 il simplifie la création et l'utilisation de celui-ci. J'utilise la réponse à ce poste Simple example of threading in C++ pour simplement créer un fil simple.Erreur simple avec la création d'un fil

Mais il y a une différence entre moi et la réponse du post, je ne suis pas dans un main, donc je crée mon thread dans un constructeur, et ce n'est pas les mêmes paramètres.

Voici mon code simple et ce que j'essaie de faire:

Je suis dans une classe mainWindow.cpp:

//Constructor 
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    // Constructs the new thread and runs it. Does not block execution. 
    thread t1(lancerServeur, NULL); 
    ui->setupUi(this); 
} 
void MainWindow::lancerServeur(){ 
    std::cout << "Le serveur se lance"; 
} 

Les erreurs sont les suivantes:

expected ';' before 't1' 

statement cannot resolve address of overloaded function thread t1(lancerServeur, NULL); 

Je pense que mes paramètres thread t1(lancerServeur, NULL); sont faux.

Pourriez-vous me expliquer comment cela fonctionne?

Merci.

Répondre

4

Vous utilisez std::cout, donc je suppose que ce n'est pas using namespace std; ou similaire avant le thread. Essayez std::thread.

Essayez un lambda std::thread t1([this](){this->lancerServeur();});

N'oubliez pas th1.join() avant de quitter le constructeur, sinon std::terminate sera appelé dans le thread destructor.

Si le fil th1 fonctionnera pendant un certain temps, puis en faire une variable membre de classe et l'initialisation ressemblera th1 = std::move(std::thread t1([this](){this->lancerServeur();})); Dans la destructor classe, th1.join();

+0

J'ai quand je l'utilise std devant de thread: pas de fonction correspondante pour l'appel à 'std :: thread :: thread (, NULL)' –

+0

La fonction 'MainWindow :: lancerServeur' devrait être statique ou utiliser un 'lambda' std :: thread ([this]() {this-> lancerServeur();}); ' – Niall

+0

Si je le mets statique, j'ai ceci: aucun type nommé 'type' dans 'class std :: result_of ' typedef typename result_of <_Callable (_Args ...)> :: type result_type; –