C++ 螺纹基类C++;

C++ 螺纹基类C++;,c++,multithreading,c++11,pthreads,C++,Multithreading,C++11,Pthreads,我想做一些线程基类。我写的代码,我认为应该可以工作,它编译并运行,但它没有显示任何内容。我想,问题在于回调,但我可能错了。那么,我的代码出了什么问题 class ThreadedBase { public: ThreadedBase(bool start = false) : m_running(false) { if (start) this->start(); } virtual ~ThreadedBase() {

我想做一些线程基类。我写的代码,我认为应该可以工作,它编译并运行,但它没有显示任何内容。我想,问题在于回调,但我可能错了。那么,我的代码出了什么问题

class ThreadedBase
{
public:
    ThreadedBase(bool start = false) : m_running(false) {
        if (start)
            this->start();
    }
    virtual ~ThreadedBase() {
        m_running = false;
        m_thread.join();
    }

    bool start(){
        if (m_running) {
            return false;
        };
        m_thread = std::thread(&ThreadedBase::run, this);
        m_running = true;
        return true;
    };

    bool stop(){
        if (!m_running) {
            return false;
        };
        m_running = false;
        return true;
    };

protected:
    virtual void threadedBlock() = 0;

    void run() {
        while (m_running) {
            threadedBlock();
        }
    }

private:
    std::thread m_thread;
    bool m_running;
};

class Test : public ThreadedBase
{
public:
    Test(bool start = true) : ThreadedBase(start) {}

    void threadedBlock() {
        std::cout << "Task\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
};

int main()
{
    Test t(true);
    t.start();

    std::this_thread::sleep_for(std::chrono::seconds(100));

    return 0;
}
类ThreadedBase
{
公众:
ThreadedBase(bool start=false):m_正在运行(false){
如果(启动)
这个->开始();
}
虚拟~ThreadedBase(){
m_running=假;
m_thread.join();
}
boolstart(){
如果(m_正在运行){
返回false;
};
m_thread=std::thread(&ThreadedBase::run,this);
m_running=true;
返回true;
};
bool-stop(){
如果(!m_正在运行){
返回false;
};
m_running=假;
返回true;
};
受保护的:
虚拟void threadedBlock()=0;
无效运行(){
同时(m_运行){
threadedBlock();
}
}
私人:
标准:螺纹m_螺纹;
布尔穆尔跑步;
};
类测试:公共ThreadedBase
{
公众:
测试(bool start=true):ThreadedBase(start){}
void threadedBlock(){

std::cout您永远不会刷新std::cout流。 尝试更改:

std::cout << "Task\n";

std::cout您永远不会刷新std::cout流。
尝试更改:

std::cout << "Task\n";
std::cout您需要添加:

m_running = true;
之前:

m_thread = std::thread(&ThreadedBase::run, this);
您需要添加:

m_running = true;
之前:

m_thread = std::thread(&ThreadedBase::run, this);

当你说“不显示任何内容”时,你的意思是它不显示命令提示符(或在你运行程序的任何地方),还是说它不显示任何文本?它不显示(std::cout当你说“不显示任何内容”时,你的意思是它不显示命令提示符(或在你运行程序的任何地方)或者你只是说它不显示任何文本吗?它不显示(std::cout Yep,问题就在这里。但是现在它崩溃了,“纯虚拟函数调用”尝试添加“覆盖”要测试的关键字::threadedBlock的声明以确保正确重写该函数。您从基类构造函数调用start,派生对象不存在。从基类构造函数中删除if(start)this->start(),并将其添加到派生类。更准确地说,问题是“start”使用虚拟函数“run”从基类的构造函数来看,“start”本身不是问题,因为它不是virtualYep,问题就出在这里。但是现在它在“纯虚拟函数调用”中崩溃,请尝试添加“覆盖”要测试的关键字::threadedBlock的声明以确保正确重写该函数。您从基类构造函数调用start,派生对象不存在。从基类构造函数中删除if(start)this->start(),并将其添加到派生类。更准确地说,问题是“start”使用虚拟函数“run”从基类的构造函数来看,“开始”本身不是问题,因为它不是虚拟坦克,但它不是问题:)我认为它应该/可能是问题。它现在可以在您的平台上工作,但不能在其他坦克上工作,但它不是问题:)我认为这应该/可能是个问题。它现在可以在您的平台上工作,但在其他平台上不起作用