C ++ 11从类构造函数和错误中启动新线程

时间:2014-08-05 18:35:41

标签: c++ multithreading qt c++11

我在stackoverflow上看到了一些想法从类中启动线程。

我的功能 - 必须运行此功能

//header.h
private:
void updateTime();
//cpp
void class::updateTime(){
    while (true){
        Sleep(1000);
    }
}

从我的类构造函数(这是QT类构造函数)

我试着用它:

std::thread t1{&class::updateTime,this};

或者是lambda风格

std::thread t1{ [this] { updateTime(); }  };

但我仍然有错误

http://i.imgur.com/DnOvEDp.jpg

我认为方法应该有效; 0调试器返回: enter image description here

1 个答案:

答案 0 :(得分:1)

根据评论中的描述,听起来你希望你的课程有点像这样:

struct foo
{
    void updateTimer()
    {
        while(running_) {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            std::cout << "Hello" << std::endl;
        }
    }

    std::atomic_bool running_{true};
    std::thread t_{&foo::updateTimer, this};
    ~foo()
    {
        running_ = false;
        t_.join();
        std::cout << "Thread stopped\n";
    }
};

上面的类在构造时启动一个线程,每秒打印Hello一次,直到它被发出停止信号。此信令由~foo()完成,这是必要的,因为没有它,destructor for t将在joinable时执行。这将导致std::terminate被调用。可加入的std::thread必须是joindetach,以防止这种情况发生。

此处使用上述课程的an example