2013-08-22 12 views
6

Próbuję zaprogramować serwer wiersza poleceń, który odbierałby informacje z portu szeregowego, analizował go i zapisywał w obiekcie wewnętrznym.C++ std :: thread funkcji elementu

Następnie, na żądanie klienta, serwer zwróci żądane informacje.

Co chcę zrobić, to umieścić odbiornik & w oddzielnym wątku, aby serwer działał obok, nie ingerując w zbieranie danych.

#include <iostream> 
#include <thread> 

class exampleClass{ 
    std::thread *processThread; 

    public void completeProcess(){ 
     while(1){ 
      processStep1(); 
      if (verification()){processStep2()} 
     } 
    }; 

    void processStep1(){...}; 
    void processStep2(){...}; 
    bool verification(){...}; 
    void runThreaded(); 
} // End example class definition 

// The idea being that this thread runs independently 
// until I call the object's destructor 

exampleClass::runThreaded(){ 
    std::thread processThread(&exampleClass::completeProcess, this); 
} // Unfortunately The program ends up crashing here with CIGARET 
+0

Czy można skompilować 'public void completeProcess() {..'? – Deqing

+0

Możliwy duplikat [Rozpocznij wątek z funkcją członka] (http://stackoverflow.com/questions/10673585/start-thread-with-member-function) –

Odpowiedz

8

Ty prowadzisz lokalnej wątek wewnątrz funkcji składowej. Trzeba dołączyć go albo odłączyć go, ponieważ jest to lokalny, trzeba to zrobić w funkcji samego:

exampleClass::runThreaded() 
{ 
    std::thread processThread(&exampleClass::completeProcess, this); 
    // more stuff 
    processThread.join(); 
} // 

Jestem zgadywania, czego naprawdę chcę to uruchomić wątek członek dane zamiast uruchomienia lokalny. Jeśli to zrobisz, musisz jeszcze gdzieś do niego dołączyć, na przykład w destruktorze. W tym przypadku metoda powinna być

exampleClass::runThreaded() 
{ 
    processThread = std::thread(&exampleClass::completeProcess, this); 
} 

i destruktora

exampleClass::~exampleClass() 
{ 
    processThread.join(); 
} 

i processThread powinny być std::thread, nie wskaźnik do jednego.

Tylko uwaga na temat projektu: jeśli chcesz, aby metoda runThreaded działała na element danych wątku, musisz być bardzo ostrożny, aby nie wywoływać go więcej niż jeden raz przed dołączeniem wątku. Może być bardziej sensowne uruchamianie wątku w konstruktorze i dołączanie go do destruktora.

+0

To (drugi pomysł), to dzięki! – Torrijos

3

Obiekt gwintu znajduje się na stosie i zostanie zniszczony na końcu funkcji. Obiekt wątkowy obiekt destruktor wywołuje std::terminate, jeśli wątek nadal działa, tak jak w twoim przypadku. Zobacz here.

Powiązane problemy